From 56e2de84fd8b46185fcd32082bbc0dca070e9e94 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 6 Sep 2021 13:40:14 +0200 Subject: [PATCH 01/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/Sniffs/Legacy/ClassesPHPSniff.php | 93 ++++++++++++++++++++ Magento2/Tests/Legacy/ClassesPHPUnitTest.inc | 10 +++ Magento2/Tests/Legacy/ClassesPHPUnitTest.php | 30 +++++++ 3 files changed, 133 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/ClassesPHPSniff.php create mode 100644 Magento2/Tests/Legacy/ClassesPHPUnitTest.inc create mode 100644 Magento2/Tests/Legacy/ClassesPHPUnitTest.php diff --git a/Magento2/Sniffs/Legacy/ClassesPHPSniff.php b/Magento2/Sniffs/Legacy/ClassesPHPSniff.php new file mode 100644 index 00000000..6849b46d --- /dev/null +++ b/Magento2/Sniffs/Legacy/ClassesPHPSniff.php @@ -0,0 +1,93 @@ +getTokens(); + $methodNameStackPtr = $phpcsFile->findNext(T_STRING, $stackPtr + 1, null, false, null, true); + if ($methodNameStackPtr === false) { + return; + } + $name = $tokens[$methodNameStackPtr]['content']; + if (in_array($name, $this->methodsThatReceiveClassNameAsFirstArgument)) { + $firstArgumentStackPtr = $phpcsFile->findNext( + [T_CONSTANT_ENCAPSED_STRING], + $methodNameStackPtr + 1, + null, + false, + null, + true + ); + if ($firstArgumentStackPtr === false) { + return; + } + $name = $tokens[$firstArgumentStackPtr]['content']; + if (!$this->isAValidNonFactoryName($name)) { + $phpcsFile->addError( + self::errorMessage, + $methodNameStackPtr + 1, + self::errorCode, + ); + } + } + } + + /** + * Check whether specified classes or module names correspond to a file according PSR-1 Standard. + * + * @param string $name + * @return bool + */ + private function isAValidNonFactoryName(string $name): bool + { + if (strpos($name, 'Magento') === false) { + return true; + } + + if (false === strpos($name, '\\')) { + return false; + } + + if (preg_match('/^([A-Z\\\\][A-Za-z\d\\\\]+)+$/', $name) !== 1) { + return false; + } + + return true; + } +} diff --git a/Magento2/Tests/Legacy/ClassesPHPUnitTest.inc b/Magento2/Tests/Legacy/ClassesPHPUnitTest.inc new file mode 100644 index 00000000..5482d3fe --- /dev/null +++ b/Magento2/Tests/Legacy/ClassesPHPUnitTest.inc @@ -0,0 +1,10 @@ + 1, + 9 => 1, + ]; + } + + /** + * @inheritdoc + */ + public function getWarningList() + { + return []; + } +} From c9703a6f40e8596285447000309182179a98a823 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 6 Sep 2021 15:31:47 +0200 Subject: [PATCH 02/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/Sniffs/Legacy/ClassesPHPSniff.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassesPHPSniff.php b/Magento2/Sniffs/Legacy/ClassesPHPSniff.php index 6849b46d..866afefc 100644 --- a/Magento2/Sniffs/Legacy/ClassesPHPSniff.php +++ b/Magento2/Sniffs/Legacy/ClassesPHPSniff.php @@ -11,9 +11,9 @@ class ClassesPHPSniff implements Sniff { - private const errorMessage = 'Obsolete factory name(s) detected'; + private const ERROR_MESSAGE = 'Obsolete factory name(s) detected'; - private const errorCode = 'ObsoleteFactoryName'; + private const ERROR_CODE = 'ObsoleteFactoryName'; private $methodsThatReceiveClassNameAsFirstArgument = [ 'getModel', 'getSingleton', 'getResourceModel', 'getResourceSingleton', @@ -32,7 +32,6 @@ public function register(): array T_DOUBLE_COLON, ]; } - /** * @inheritdoc @@ -60,9 +59,9 @@ public function process(File $phpcsFile, $stackPtr) $name = $tokens[$firstArgumentStackPtr]['content']; if (!$this->isAValidNonFactoryName($name)) { $phpcsFile->addError( - self::errorMessage, + self::ERROR_MESSAGE, $methodNameStackPtr + 1, - self::errorCode, + self::ERROR_CODE, ); } } From 5a83385431d2b0628f341c757b761ab663c9039e Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 9 Sep 2021 11:45:49 +0200 Subject: [PATCH 03/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...niff.php => ObsoleteMethodsUsageSniff.php} | 46 ++++--------------- ...t.inc => ObsoleteMethodsUsageUnitTest.inc} | 6 +-- ...t.php => ObsoleteMethodsUsageUnitTest.php} | 7 +-- 3 files changed, 15 insertions(+), 44 deletions(-) rename Magento2/Sniffs/Legacy/{ClassesPHPSniff.php => ObsoleteMethodsUsageSniff.php} (53%) rename Magento2/Tests/Legacy/{ClassesPHPUnitTest.inc => ObsoleteMethodsUsageUnitTest.inc} (64%) rename Magento2/Tests/Legacy/{ClassesPHPUnitTest.php => ObsoleteMethodsUsageUnitTest.php} (76%) diff --git a/Magento2/Sniffs/Legacy/ClassesPHPSniff.php b/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php similarity index 53% rename from Magento2/Sniffs/Legacy/ClassesPHPSniff.php rename to Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php index 866afefc..44ae964b 100644 --- a/Magento2/Sniffs/Legacy/ClassesPHPSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php @@ -8,14 +8,13 @@ use PHP_CodeSniffer\Sniffs\Sniff; use PHP_CodeSniffer\Files\File; -class ClassesPHPSniff implements Sniff +class ObsoleteMethodsUsageSniff implements Sniff { - - private const ERROR_MESSAGE = 'Obsolete factory name(s) detected'; + private const ERROR_MESSAGE = 'Obsolete methods usage detected'; - private const ERROR_CODE = 'ObsoleteFactoryName'; + private const ERROR_CODE = 'ObsoleteMethodsUsage'; - private $methodsThatReceiveClassNameAsFirstArgument = [ + private $obsoleteStaticMethods = [ 'getModel', 'getSingleton', 'getResourceModel', 'getResourceSingleton', 'addBlock', 'createBlock', 'getBlockSingleton', 'initReport', 'setEntityModelClass', 'setAttributeModel', 'setBackendModel', 'setFrontendModel', @@ -28,7 +27,6 @@ class ClassesPHPSniff implements Sniff public function register(): array { return [ - T_OBJECT, T_DOUBLE_COLON, ]; } @@ -44,20 +42,19 @@ public function process(File $phpcsFile, $stackPtr) return; } $name = $tokens[$methodNameStackPtr]['content']; - if (in_array($name, $this->methodsThatReceiveClassNameAsFirstArgument)) { - $firstArgumentStackPtr = $phpcsFile->findNext( - [T_CONSTANT_ENCAPSED_STRING], - $methodNameStackPtr + 1, + if (in_array($name, $this->obsoleteStaticMethods)) { + $classNameStackPtr = $phpcsFile->findPrevious( + [T_STRING], + $methodNameStackPtr - 1, null, false, null, true ); - if ($firstArgumentStackPtr === false) { + if ($classNameStackPtr === false) { return; } - $name = $tokens[$firstArgumentStackPtr]['content']; - if (!$this->isAValidNonFactoryName($name)) { + if ($tokens[$classNameStackPtr]['content'] === 'Mage') { $phpcsFile->addError( self::ERROR_MESSAGE, $methodNameStackPtr + 1, @@ -66,27 +63,4 @@ public function process(File $phpcsFile, $stackPtr) } } } - - /** - * Check whether specified classes or module names correspond to a file according PSR-1 Standard. - * - * @param string $name - * @return bool - */ - private function isAValidNonFactoryName(string $name): bool - { - if (strpos($name, 'Magento') === false) { - return true; - } - - if (false === strpos($name, '\\')) { - return false; - } - - if (preg_match('/^([A-Z\\\\][A-Za-z\d\\\\]+)+$/', $name) !== 1) { - return false; - } - - return true; - } } diff --git a/Magento2/Tests/Legacy/ClassesPHPUnitTest.inc b/Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.inc similarity index 64% rename from Magento2/Tests/Legacy/ClassesPHPUnitTest.inc rename to Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.inc index 5482d3fe..91583ae7 100644 --- a/Magento2/Tests/Legacy/ClassesPHPUnitTest.inc +++ b/Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.inc @@ -1,10 +1,6 @@ 1, - 9 => 1, + 3 => 1, + 5 => 1, + 6 => 1, ]; } From 5b407128bb6de41fb2348c0bcfc55dc163f7e7fa Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 9 Sep 2021 11:51:44 +0200 Subject: [PATCH 04/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php b/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php index 44ae964b..d12c9fa6 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php @@ -14,6 +14,9 @@ class ObsoleteMethodsUsageSniff implements Sniff private const ERROR_CODE = 'ObsoleteMethodsUsage'; + /** + * @var string[] + */ private $obsoleteStaticMethods = [ 'getModel', 'getSingleton', 'getResourceModel', 'getResourceSingleton', 'addBlock', 'createBlock', 'getBlockSingleton', From 9d542d9f2c04d74e0e45930316c31d30894257b6 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 11:28:03 +0200 Subject: [PATCH 05/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../Legacy/ClassesConfigurationSniff.php | 214 ++++++++++++++++++ Magento2/Sniffs/Legacy/ExtendedNode.php | 25 ++ .../Legacy/ClassesConfigurationUnitTest.1.xml | 45 ++++ .../Legacy/ClassesConfigurationUnitTest.2.xml | 52 +++++ .../Legacy/ClassesConfigurationUnitTest.php | 38 ++++ Magento2/ruleset.xml | 8 + 6 files changed, 382 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php create mode 100644 Magento2/Sniffs/Legacy/ExtendedNode.php create mode 100644 Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml create mode 100644 Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml create mode 100644 Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php diff --git a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php new file mode 100644 index 00000000..67431932 --- /dev/null +++ b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php @@ -0,0 +1,214 @@ + 0) { + return; + } + + // We need to format the incoming XML to avoid tags split into several lines. In that case, PHP's DOMElement + // returns the position of the closing /> as the position of the tag, and we need the position of < + // instead, as it is the one we compare with $stackPtr later on. + $xml = simplexml_load_string($this->getFormattedXML($phpcsFile)); + if ($xml === false) { + $phpcsFile->addError( + sprintf( + "Couldn't parse contents of '%s', check that they are in valid XML format", + $phpcsFile->getFilename(), + ), + $stackPtr, + self::ERROR_CODE_CONFIG + ); + } + + $classes = $this->collectClassesInConfig($xml); + $this->assertNonFactoryName($phpcsFile, $stackPtr, $classes); + + $modules = $this->getXmlAttributeValues($xml, '//@module', 'module'); + $this->assertNonFactoryNameModule($phpcsFile, $stackPtr, $modules); + } + + /** + * Check whether specified classes or module names correspond to a file according PSR-1 Standard. + * + * @param File $phpcsFile + * @param int $stackPtr + * @param ExtendedNode[] $elements + */ + private function assertNonFactoryName(File $phpcsFile, int $stackPtr, array $elements) + { + foreach ($elements as $element) { + if (stripos($element->value, 'Magento') === false) { + continue; + } + if (preg_match('/^([A-Z][a-z\d\\\\]+)+$/', $element->value) !== 1) { + $phpcsFile->addError( + self::ERROR_MESSAGE_CONFIG, + $element->element->getLineNo() - 1, + self::ERROR_CODE_CONFIG, + ); + } + } + } + + /** + * Check whether specified classes or module names correspond to a file according PSR-1 Standard. + * + * @param File $phpcsFile + * @param int $stackPtr + * @param ExtendedNode[] $classes + */ + private function assertNonFactoryNameModule(File $phpcsFile, int $stackPtr, array $classes) + { + foreach ($classes as $element) { + if (preg_match('/^([A-Z][A-Za-z\d_]+)+$/', $element->value) !== 1) { + $phpcsFile->addError( + self::ERROR_MESSAGE_MODULE, + $element->element->getLineNo() - 1, + self::ERROR_CODE_MODULE, + ); + } + } + } + + /** + * Format the incoming XML to avoid tags split into several lines. + * + * @param File $phpcsFile + * @return false|string + */ + private function getFormattedXML(File $phpcsFile) + { + $doc = new DomDocument('1.0'); + $doc->formatOutput = true; + $doc->loadXML($phpcsFile->getTokensAsString(0, 999999)); + return $doc->saveXML(); + } + + /** + * @param SimpleXMLElement $xml + * @return array + */ + private function collectClassesInConfig(SimpleXMLElement $xml): array + { + $classes = $this->getXmlNode( + $xml, + ' + /config//resource_adapter | /config/*[not(name()="sections")]//class[not(ancestor::observers)] + | //model[not(parent::connection)] | //backend_model | //source_model | //price_model + | //model_token | //writer_model | //clone_model | //frontend_model | //working_model + | //admin_renderer | //renderer | /config/*/di/preferences/*' + ); + $classes = array_merge($classes, $this->getXmlAttributeValues($xml, '//@backend_model', 'backend_model')); + $classes = array_merge( + $classes, + $this->getXmlNodeNames( + $xml, + '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/* | /config/*/di/preferences/*' + ) + ); + + $classes = array_map( + function(ExtendedNode $extendedNode) { + $extendedNode->value = explode('::', trim($extendedNode->value))[0]; + return $extendedNode; + }, + $classes + ); + $classes = array_filter( + $classes, + function ($value) { + return !empty($value); + } + ); + + return $classes; + } + + /** + * Get XML node text values using specified xPath + * + * The node must contain specified attribute + * + * @param SimpleXMLElement $xml + * @param string $xPath + * @return array + */ + private function getXmlNode(SimpleXMLElement $xml, string $xPath): array + { + $result = []; + $nodes = $xml->xpath($xPath) ?: []; + foreach ($nodes as $node) { + $result[] = new ExtendedNode((string)$node, $node); + } + return $result; + } + + /** + * Get XML node names using specified xPath + * + * @param SimpleXMLElement $xml + * @param string $xpath + * @return array + */ + private function getXmlNodeNames(SimpleXMLElement $xml, string $xpath): array + { + $result = []; + $nodes = $xml->xpath($xpath) ?: []; + foreach ($nodes as $node) { + $result[] = new ExtendedNode($node->getName(), $node); + } + return $result; + } + + /** + * Get XML node attribute values using specified xPath + * + * @param SimpleXMLElement $xml + * @param string $xPath + * @param string $attributeName + * @return array + */ + private function getXmlAttributeValues(SimpleXMLElement $xml, string $xPath, string $attributeName): array + { + $result = []; + $nodes = $xml->xpath($xPath) ?: []; + foreach ($nodes as $node) { + $nodeArray = (array)$node; + if (isset($nodeArray['@attributes'][$attributeName])) { + $result[] = new ExtendedNode($nodeArray['@attributes'][$attributeName], $node); + } + } + return $result; + } +} diff --git a/Magento2/Sniffs/Legacy/ExtendedNode.php b/Magento2/Sniffs/Legacy/ExtendedNode.php new file mode 100644 index 00000000..dbbd8e8d --- /dev/null +++ b/Magento2/Sniffs/Legacy/ExtendedNode.php @@ -0,0 +1,25 @@ +value = $value; + $this->element = dom_import_simplexml($element); + } +} \ No newline at end of file diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml new file mode 100644 index 00000000..f4a7b5cd --- /dev/null +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml @@ -0,0 +1,45 @@ + + + + +
+ + + + + Magento\Config\Model\Config\Source\Yesno + + + + + + + Magento\CONFIG\Model\Config\Source\Yesno + + + + + + + Config\Model\Config\Source\Yesno + + + + + + + Sales\MODEL\Config\Source\Order\Status\NewStatus + + + + MAGENTO\Payment\Model\Config\Source\Allspecificcountries + + +
+
+
\ No newline at end of file diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml new file mode 100644 index 00000000..5ea35a2e --- /dev/null +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml @@ -0,0 +1,52 @@ + + + + +
+ + + + + Magento\Config\Model\Config\Source\Yesno + + + + + + + + Magento\CONFIG\Model\Config\Source\Yesno + + + + + + + + Config\Model\Config\Source\Yesno + + + + + + + Sales\MODEL\Config\Source\Order\Status\NewStatus + + + + + + + MAGENTO\Payment\Model\Config\Source\Allspecificcountries + + + + +
+
+
\ No newline at end of file diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php new file mode 100644 index 00000000..20a249b2 --- /dev/null +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php @@ -0,0 +1,38 @@ + 1, + 40 => 1, + ]; + } + if ($testFile === 'ClassesConfigurationUnitTest.2.xml') { + return [ + 22 => 1, + 42 => 1, + ]; + } + } + + /** + * @inheritdoc + */ + public function getWarningList($testFile = '') + { + return []; + } +} diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 212bf246..d1b4cfb0 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -115,6 +115,14 @@ 10 error + + *\/etc/*.xml$ + *\/etc/wsdl.xml$ + *\/etc/wsdl2.xml$ + *\/etc/wsi.xml$ + 10 + warning + From 2c5c076f64a91351166dfdb4f93417f34dd3b37d Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 11:33:26 +0200 Subject: [PATCH 06/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/Sniffs/Legacy/ExtendedNode.php | 2 +- .../Legacy/ObsoleteMethodsUsageSniff.php | 69 ------------------- .../Legacy/ClassesConfigurationUnitTest.1.xml | 2 +- .../Legacy/ClassesConfigurationUnitTest.2.xml | 2 +- .../Legacy/ObsoleteMethodsUsageUnitTest.inc | 6 -- .../Legacy/ObsoleteMethodsUsageUnitTest.php | 31 --------- 6 files changed, 3 insertions(+), 109 deletions(-) delete mode 100644 Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php delete mode 100644 Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.inc delete mode 100644 Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.php diff --git a/Magento2/Sniffs/Legacy/ExtendedNode.php b/Magento2/Sniffs/Legacy/ExtendedNode.php index dbbd8e8d..8efb770e 100644 --- a/Magento2/Sniffs/Legacy/ExtendedNode.php +++ b/Magento2/Sniffs/Legacy/ExtendedNode.php @@ -22,4 +22,4 @@ public function __construct(string $value, SimpleXMLElement $element) $this->value = $value; $this->element = dom_import_simplexml($element); } -} \ No newline at end of file +} diff --git a/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php b/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php deleted file mode 100644 index d12c9fa6..00000000 --- a/Magento2/Sniffs/Legacy/ObsoleteMethodsUsageSniff.php +++ /dev/null @@ -1,69 +0,0 @@ -getTokens(); - $methodNameStackPtr = $phpcsFile->findNext(T_STRING, $stackPtr + 1, null, false, null, true); - if ($methodNameStackPtr === false) { - return; - } - $name = $tokens[$methodNameStackPtr]['content']; - if (in_array($name, $this->obsoleteStaticMethods)) { - $classNameStackPtr = $phpcsFile->findPrevious( - [T_STRING], - $methodNameStackPtr - 1, - null, - false, - null, - true - ); - if ($classNameStackPtr === false) { - return; - } - if ($tokens[$classNameStackPtr]['content'] === 'Mage') { - $phpcsFile->addError( - self::ERROR_MESSAGE, - $methodNameStackPtr + 1, - self::ERROR_CODE, - ); - } - } - } -} diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml index f4a7b5cd..864a154e 100644 --- a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml @@ -42,4 +42,4 @@ - \ No newline at end of file + diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml index 5ea35a2e..2753291f 100644 --- a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml @@ -49,4 +49,4 @@ - \ No newline at end of file + diff --git a/Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.inc b/Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.inc deleted file mode 100644 index 91583ae7..00000000 --- a/Magento2/Tests/Legacy/ObsoleteMethodsUsageUnitTest.inc +++ /dev/null @@ -1,6 +0,0 @@ - 1, - 5 => 1, - 6 => 1, - ]; - } - - /** - * @inheritdoc - */ - public function getWarningList() - { - return []; - } -} From 3636e9d81ac44ef12a8e4344d09962d21968c552 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 11:34:27 +0200 Subject: [PATCH 07/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/Sniffs/Legacy/ExtendedNode.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Magento2/Sniffs/Legacy/ExtendedNode.php b/Magento2/Sniffs/Legacy/ExtendedNode.php index 8efb770e..e3c69516 100644 --- a/Magento2/Sniffs/Legacy/ExtendedNode.php +++ b/Magento2/Sniffs/Legacy/ExtendedNode.php @@ -17,6 +17,10 @@ class ExtendedNode */ public $element; + /** + * @param string $value + * @param SimpleXMLElement $element + */ public function __construct(string $value, SimpleXMLElement $element) { $this->value = $value; From 029356085c064db4fd437e7a667268f267898428 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 11:35:40 +0200 Subject: [PATCH 08/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php index 67431932..4502ed27 100644 --- a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php +++ b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php @@ -52,20 +52,19 @@ public function process(File $phpcsFile, $stackPtr) } $classes = $this->collectClassesInConfig($xml); - $this->assertNonFactoryName($phpcsFile, $stackPtr, $classes); + $this->assertNonFactoryName($phpcsFile, $classes); $modules = $this->getXmlAttributeValues($xml, '//@module', 'module'); - $this->assertNonFactoryNameModule($phpcsFile, $stackPtr, $modules); + $this->assertNonFactoryNameModule($phpcsFile, $modules); } /** * Check whether specified classes or module names correspond to a file according PSR-1 Standard. * * @param File $phpcsFile - * @param int $stackPtr * @param ExtendedNode[] $elements */ - private function assertNonFactoryName(File $phpcsFile, int $stackPtr, array $elements) + private function assertNonFactoryName(File $phpcsFile, array $elements) { foreach ($elements as $element) { if (stripos($element->value, 'Magento') === false) { @@ -85,10 +84,9 @@ private function assertNonFactoryName(File $phpcsFile, int $stackPtr, array $ele * Check whether specified classes or module names correspond to a file according PSR-1 Standard. * * @param File $phpcsFile - * @param int $stackPtr * @param ExtendedNode[] $classes */ - private function assertNonFactoryNameModule(File $phpcsFile, int $stackPtr, array $classes) + private function assertNonFactoryNameModule(File $phpcsFile, array $classes) { foreach ($classes as $element) { if (preg_match('/^([A-Z][A-Za-z\d_]+)+$/', $element->value) !== 1) { From b91d0d4afdffdc8537cbf1d903ff301a4bfd2674 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 11:45:29 +0200 Subject: [PATCH 09/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php | 7 +++++-- Magento2/Sniffs/Legacy/ExtendedNode.php | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php index 4502ed27..46ae7cfe 100644 --- a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php +++ b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php @@ -1,8 +1,9 @@ value = explode('::', trim($extendedNode->value))[0]; return $extendedNode; }, diff --git a/Magento2/Sniffs/Legacy/ExtendedNode.php b/Magento2/Sniffs/Legacy/ExtendedNode.php index e3c69516..44c382fa 100644 --- a/Magento2/Sniffs/Legacy/ExtendedNode.php +++ b/Magento2/Sniffs/Legacy/ExtendedNode.php @@ -1,4 +1,8 @@ Date: Thu, 16 Sep 2021 11:55:27 +0200 Subject: [PATCH 10/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../Tests/Legacy/ClassesConfigurationUnitTest.3.xml | 13 +++++++++++++ .../Tests/Legacy/ClassesConfigurationUnitTest.php | 6 ++++++ 2 files changed, 19 insertions(+) create mode 100644 Magento2/Tests/Legacy/ClassesConfigurationUnitTest.3.xml diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.3.xml b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.3.xml new file mode 100644 index 00000000..4884a838 --- /dev/null +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.3.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php index 20a249b2..ad788298 100644 --- a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php @@ -26,6 +26,12 @@ public function getErrorList($testFile = '') 42 => 1, ]; } + if ($testFile === 'ClassesConfigurationUnitTest.3.xml') { + return [ + 10 => 1, + ]; + } + return []; } /** From 5810c6e22bfb6f5575fa0c0c591a2f4855ee7571 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 15:30:23 +0200 Subject: [PATCH 11/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../Legacy/ClassesConfigurationSniff.php | 5 +-- .../Legacy/ClassesConfigurationUnitTest.4.xml | 36 +++++++++++++++++++ .../Legacy/ClassesConfigurationUnitTest.php | 5 +++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 Magento2/Tests/Legacy/ClassesConfigurationUnitTest.4.xml diff --git a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php index 46ae7cfe..794eba9e 100644 --- a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php +++ b/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php @@ -128,14 +128,15 @@ private function collectClassesInConfig(SimpleXMLElement $xml): array /config//resource_adapter | /config/*[not(name()="sections")]//class[not(ancestor::observers)] | //model[not(parent::connection)] | //backend_model | //source_model | //price_model | //model_token | //writer_model | //clone_model | //frontend_model | //working_model - | //admin_renderer | //renderer | /config/*/di/preferences/*' + | //admin_renderer | //renderer' ); $classes = array_merge($classes, $this->getXmlAttributeValues($xml, '//@backend_model', 'backend_model')); + $classes = array_merge($classes, $this->getXmlAttributeValues($xml, '/config//preference', 'type')); $classes = array_merge( $classes, $this->getXmlNodeNames( $xml, - '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/* | /config/*/di/preferences/*' + '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/*' ) ); diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.4.xml b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.4.xml new file mode 100644 index 00000000..a99f0589 --- /dev/null +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.4.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + system/currency/installed + + + + + Magento\Framework\Communication\Config\Reader\XmlReader\Converter + Magento\Framework\Communication\Config\Reader\XmlReader\SchemaLocator + communication.xml + + name + name + + + + + + Magento + + + diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php index ad788298..8d747e19 100644 --- a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php +++ b/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php @@ -31,6 +31,11 @@ public function getErrorList($testFile = '') 10 => 1, ]; } + if ($testFile === 'ClassesConfigurationUnitTest.4.xml') { + return [ + 10 => 1, + ]; + } return []; } From 0bc42a6828ceb03bf405909f16d45913ac7d3431 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 16:41:12 +0200 Subject: [PATCH 12/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...hp => ClassReferencesInConfigurationFilesSniff.php} | 2 +- ... ClassReferencesInConfigurationFilesUnitTest.1.xml} | 0 ... ClassReferencesInConfigurationFilesUnitTest.2.xml} | 0 ... ClassReferencesInConfigurationFilesUnitTest.3.xml} | 0 ... ClassReferencesInConfigurationFilesUnitTest.4.xml} | 0 ...=> ClassReferencesInConfigurationFilesUnitTest.php} | 10 +++++----- 6 files changed, 6 insertions(+), 6 deletions(-) rename Magento2/Sniffs/Legacy/{ClassesConfigurationSniff.php => ClassReferencesInConfigurationFilesSniff.php} (99%) rename Magento2/Tests/Legacy/{ClassesConfigurationUnitTest.1.xml => ClassReferencesInConfigurationFilesUnitTest.1.xml} (100%) rename Magento2/Tests/Legacy/{ClassesConfigurationUnitTest.2.xml => ClassReferencesInConfigurationFilesUnitTest.2.xml} (100%) rename Magento2/Tests/Legacy/{ClassesConfigurationUnitTest.3.xml => ClassReferencesInConfigurationFilesUnitTest.3.xml} (100%) rename Magento2/Tests/Legacy/{ClassesConfigurationUnitTest.4.xml => ClassReferencesInConfigurationFilesUnitTest.4.xml} (100%) rename Magento2/Tests/Legacy/{ClassesConfigurationUnitTest.php => ClassReferencesInConfigurationFilesUnitTest.php} (65%) diff --git a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php similarity index 99% rename from Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php rename to Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 794eba9e..55dff999 100644 --- a/Magento2/Sniffs/Legacy/ClassesConfigurationSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -11,7 +11,7 @@ use PHP_CodeSniffer\Files\File; use SimpleXMLElement; -class ClassesConfigurationSniff implements Sniff +class ClassReferencesInConfigurationFilesSniff implements Sniff { private const ERROR_MESSAGE_CONFIG = 'Attribute does not follow expected format'; private const ERROR_CODE_CONFIG = 'WrongXML'; diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.1.xml similarity index 100% rename from Magento2/Tests/Legacy/ClassesConfigurationUnitTest.1.xml rename to Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.1.xml diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.2.xml similarity index 100% rename from Magento2/Tests/Legacy/ClassesConfigurationUnitTest.2.xml rename to Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.2.xml diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.3.xml b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.3.xml similarity index 100% rename from Magento2/Tests/Legacy/ClassesConfigurationUnitTest.3.xml rename to Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.3.xml diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.4.xml b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.4.xml similarity index 100% rename from Magento2/Tests/Legacy/ClassesConfigurationUnitTest.4.xml rename to Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.4.xml diff --git a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.php similarity index 65% rename from Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php rename to Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.php index 8d747e19..83bb6f1d 100644 --- a/Magento2/Tests/Legacy/ClassesConfigurationUnitTest.php +++ b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.php @@ -7,31 +7,31 @@ use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; -class ClassesConfigurationUnitTest extends AbstractSniffUnitTest +class ClassReferencesInConfigurationFilesUnitTest extends AbstractSniffUnitTest { /** * @inheritdoc */ public function getErrorList($testFile = '') { - if ($testFile === 'ClassesConfigurationUnitTest.1.xml') { + if ($testFile === 'ClassReferencesInConfigurationFilesUnitTest.1.xml') { return [ 22 => 1, 40 => 1, ]; } - if ($testFile === 'ClassesConfigurationUnitTest.2.xml') { + if ($testFile === 'ClassReferencesInConfigurationFilesUnitTest.2.xml') { return [ 22 => 1, 42 => 1, ]; } - if ($testFile === 'ClassesConfigurationUnitTest.3.xml') { + if ($testFile === 'ClassReferencesInConfigurationFilesUnitTest.3.xml') { return [ 10 => 1, ]; } - if ($testFile === 'ClassesConfigurationUnitTest.4.xml') { + if ($testFile === 'ClassReferencesInConfigurationFilesUnitTest.4.xml') { return [ 10 => 1, ]; From 19bb57b569245f20d96a0feded57fdb127492565 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 17:19:22 +0200 Subject: [PATCH 13/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- Magento2/ruleset.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index d1b4cfb0..65d2cb3b 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -115,7 +115,7 @@ 10 error - + *\/etc/*.xml$ *\/etc/wsdl.xml$ *\/etc/wsdl2.xml$ From 48a58169ac51178250625b96798be3f69233a0ff Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 16 Sep 2021 17:20:36 +0200 Subject: [PATCH 14/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../Legacy/ClassReferencesInConfigurationFilesSniff.php | 4 ++-- Magento2/Sniffs/Legacy/ExtendedNode.php | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 55dff999..79f804af 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -74,7 +74,7 @@ private function assertNonFactoryName(File $phpcsFile, array $elements) if (preg_match('/^([A-Z][a-z\d\\\\]+)+$/', $element->value) !== 1) { $phpcsFile->addError( self::ERROR_MESSAGE_CONFIG, - $element->element->getLineNo() - 1, + $element->lineNumber - 1, self::ERROR_CODE_CONFIG, ); } @@ -93,7 +93,7 @@ private function assertNonFactoryNameModule(File $phpcsFile, array $classes) if (preg_match('/^([A-Z][A-Za-z\d_]+)+$/', $element->value) !== 1) { $phpcsFile->addError( self::ERROR_MESSAGE_MODULE, - $element->element->getLineNo() - 1, + $element->lineNumber - 1, self::ERROR_CODE_MODULE, ); } diff --git a/Magento2/Sniffs/Legacy/ExtendedNode.php b/Magento2/Sniffs/Legacy/ExtendedNode.php index 44c382fa..0320e63c 100644 --- a/Magento2/Sniffs/Legacy/ExtendedNode.php +++ b/Magento2/Sniffs/Legacy/ExtendedNode.php @@ -6,7 +6,6 @@ namespace Magento2\Sniffs\Legacy; -use DOMElement; use SimpleXMLElement; class ExtendedNode @@ -17,9 +16,9 @@ class ExtendedNode public $value; /** - * @var DOMElement + * @var int */ - public $element; + public $lineNumber; /** * @param string $value @@ -28,6 +27,6 @@ class ExtendedNode public function __construct(string $value, SimpleXMLElement $element) { $this->value = $value; - $this->element = dom_import_simplexml($element); + $this->lineNumber = dom_import_simplexml($element)->getLineNo(); } } From b10df58d041ee7bf6993d9e76013c5c3e1cb62fb Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Fri, 17 Sep 2021 13:58:15 +0200 Subject: [PATCH 15/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...assReferencesInConfigurationFilesSniff.php | 106 ++++++++---------- 1 file changed, 46 insertions(+), 60 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 79f804af..6e4f37f7 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -18,6 +18,10 @@ class ClassReferencesInConfigurationFilesSniff implements Sniff private const ERROR_MESSAGE_MODULE = 'Attribute does not follow expected format in module'; private const ERROR_CODE_MODULE = 'WrongXMLModule'; + private const FROM_CONTENT = 1; + private const FROM_NAME = 2; + private const FROM_ATTRIBUTE = 3; + /** * @inheritdoc */ @@ -55,7 +59,7 @@ public function process(File $phpcsFile, $stackPtr) $classes = $this->collectClassesInConfig($xml); $this->assertNonFactoryName($phpcsFile, $classes); - $modules = $this->getXmlAttributeValues($xml, '//@module', 'module'); + $modules = $this->getValuesFromXml($xml, '//@module', self::FROM_ATTRIBUTE, 'module'); $this->assertNonFactoryNameModule($phpcsFile, $modules); } @@ -122,21 +126,39 @@ private function getFormattedXML(File $phpcsFile) */ private function collectClassesInConfig(SimpleXMLElement $xml): array { - $classes = $this->getXmlNode( + $classes = $this->getValuesFromXml( $xml, ' /config//resource_adapter | /config/*[not(name()="sections")]//class[not(ancestor::observers)] | //model[not(parent::connection)] | //backend_model | //source_model | //price_model | //model_token | //writer_model | //clone_model | //frontend_model | //working_model - | //admin_renderer | //renderer' + | //admin_renderer | //renderer', + self::FROM_CONTENT + ); + $classes = array_merge( + $classes, + $this->getValuesFromXml( + $xml, + '//@backend_model', + self::FROM_ATTRIBUTE, + 'backend_model' + ) ); - $classes = array_merge($classes, $this->getXmlAttributeValues($xml, '//@backend_model', 'backend_model')); - $classes = array_merge($classes, $this->getXmlAttributeValues($xml, '/config//preference', 'type')); $classes = array_merge( $classes, - $this->getXmlNodeNames( + $this->getValuesFromXml( $xml, - '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/*' + '/config//preference', + self::FROM_ATTRIBUTE, + 'type' + ) + ); + $classes = array_merge( + $classes, + $this->getValuesFromXml( + $xml, + '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/*', + self::FROM_NAME ) ); @@ -147,70 +169,34 @@ function (ExtendedNode $extendedNode) { }, $classes ); - $classes = array_filter( - $classes, - function ($value) { - return !empty($value); - } - ); return $classes; } /** - * Get XML node text values using specified xPath - * - * The node must contain specified attribute - * + * Extract value from the specified $extractFrom which exist in the XML path + * * @param SimpleXMLElement $xml * @param string $xPath + * @param int $extractFrom + * @param string $attribute * @return array */ - private function getXmlNode(SimpleXMLElement $xml, string $xPath): array + private function getValuesFromXml(SimpleXMLElement $xml, string $xPath, int $extractFrom, string $attribute = ''): array { - $result = []; $nodes = $xml->xpath($xPath) ?: []; - foreach ($nodes as $node) { - $result[] = new ExtendedNode((string)$node, $node); - } - return $result; - } - - /** - * Get XML node names using specified xPath - * - * @param SimpleXMLElement $xml - * @param string $xpath - * @return array - */ - private function getXmlNodeNames(SimpleXMLElement $xml, string $xpath): array - { - $result = []; - $nodes = $xml->xpath($xpath) ?: []; - foreach ($nodes as $node) { - $result[] = new ExtendedNode($node->getName(), $node); - } - return $result; - } - - /** - * Get XML node attribute values using specified xPath - * - * @param SimpleXMLElement $xml - * @param string $xPath - * @param string $attributeName - * @return array - */ - private function getXmlAttributeValues(SimpleXMLElement $xml, string $xPath, string $attributeName): array - { - $result = []; - $nodes = $xml->xpath($xPath) ?: []; - foreach ($nodes as $node) { - $nodeArray = (array)$node; - if (isset($nodeArray['@attributes'][$attributeName])) { - $result[] = new ExtendedNode($nodeArray['@attributes'][$attributeName], $node); + return array_map(function($item) use ($extractFrom, $attribute) { + switch ($extractFrom) { + case self::FROM_CONTENT: + return new ExtendedNode((string)$item, $item); + case self::FROM_NAME: + return new ExtendedNode($item->getName(), $item); + case self::FROM_ATTRIBUTE: + $nodeArray = (array)$item; + if (isset($nodeArray['@attributes'][$attribute])) { + return new ExtendedNode($nodeArray['@attributes'][$attribute], $item); + } } - } - return $result; + }, $nodes); } } From 64fa0cc80ec8ea6f4a9b690bd237f153c074b523 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Fri, 17 Sep 2021 14:01:10 +0200 Subject: [PATCH 16/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../Legacy/ClassReferencesInConfigurationFilesSniff.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 6e4f37f7..a2348a96 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -64,7 +64,7 @@ public function process(File $phpcsFile, $stackPtr) } /** - * Check whether specified classes or module names correspond to a file according PSR-1 Standard. + * Check whether specified class names are right according PSR-1 Standard. * * @param File $phpcsFile * @param ExtendedNode[] $elements @@ -86,7 +86,7 @@ private function assertNonFactoryName(File $phpcsFile, array $elements) } /** - * Check whether specified classes or module names correspond to a file according PSR-1 Standard. + * Check whether specified class names in modules are right according PSR-1 Standard. * * @param File $phpcsFile * @param ExtendedNode[] $classes From 5aa57215c506a06e05e7b59fc6cdb27615b1438d Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Fri, 17 Sep 2021 14:04:19 +0200 Subject: [PATCH 17/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../ClassReferencesInConfigurationFilesSniff.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index a2348a96..700bc864 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -175,17 +175,17 @@ function (ExtendedNode $extendedNode) { /** * Extract value from the specified $extractFrom which exist in the XML path - * + * * @param SimpleXMLElement $xml * @param string $xPath * @param int $extractFrom - * @param string $attribute + * @param string $attr * @return array */ - private function getValuesFromXml(SimpleXMLElement $xml, string $xPath, int $extractFrom, string $attribute = ''): array + private function getValuesFromXml(SimpleXMLElement $xml, string $xPath, int $extractFrom, string $attr = ''): array { $nodes = $xml->xpath($xPath) ?: []; - return array_map(function($item) use ($extractFrom, $attribute) { + return array_map(function ($item) use ($extractFrom, $attr) { switch ($extractFrom) { case self::FROM_CONTENT: return new ExtendedNode((string)$item, $item); @@ -193,8 +193,8 @@ private function getValuesFromXml(SimpleXMLElement $xml, string $xPath, int $ext return new ExtendedNode($item->getName(), $item); case self::FROM_ATTRIBUTE: $nodeArray = (array)$item; - if (isset($nodeArray['@attributes'][$attribute])) { - return new ExtendedNode($nodeArray['@attributes'][$attribute], $item); + if (isset($nodeArray['@attributes'][$attr])) { + return new ExtendedNode($nodeArray['@attributes'][$attr], $item); } } }, $nodes); From 389d7cab75fdc0c3d3273f770f7c13e1e9e35ebb Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 20 Sep 2021 09:37:06 +0200 Subject: [PATCH 18/99] Update Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php Co-authored-by: Sergii Ivashchenko --- .../Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 700bc864..6cc79da0 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -13,7 +13,7 @@ class ClassReferencesInConfigurationFilesSniff implements Sniff { - private const ERROR_MESSAGE_CONFIG = 'Attribute does not follow expected format'; + private const ERROR_MESSAGE_CONFIG = 'Incorrect format of PHP class reference'; private const ERROR_CODE_CONFIG = 'WrongXML'; private const ERROR_MESSAGE_MODULE = 'Attribute does not follow expected format in module'; private const ERROR_CODE_MODULE = 'WrongXMLModule'; From c4801005cb48be77c4047287692cf7bef1d0c979 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 20 Sep 2021 09:37:12 +0200 Subject: [PATCH 19/99] Update Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php Co-authored-by: Sergii Ivashchenko --- .../Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 6cc79da0..a33c6314 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -14,7 +14,7 @@ class ClassReferencesInConfigurationFilesSniff implements Sniff { private const ERROR_MESSAGE_CONFIG = 'Incorrect format of PHP class reference'; - private const ERROR_CODE_CONFIG = 'WrongXML'; + private const ERROR_CODE_CONFIG = 'IncorrectClassReference'; private const ERROR_MESSAGE_MODULE = 'Attribute does not follow expected format in module'; private const ERROR_CODE_MODULE = 'WrongXMLModule'; From c0ead7c6d50fa0899b16bd0496161cde68748ea0 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 20 Sep 2021 09:37:18 +0200 Subject: [PATCH 20/99] Update Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php Co-authored-by: Sergii Ivashchenko --- .../Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index a33c6314..cbfc7b2b 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -15,7 +15,7 @@ class ClassReferencesInConfigurationFilesSniff implements Sniff { private const ERROR_MESSAGE_CONFIG = 'Incorrect format of PHP class reference'; private const ERROR_CODE_CONFIG = 'IncorrectClassReference'; - private const ERROR_MESSAGE_MODULE = 'Attribute does not follow expected format in module'; + private const ERROR_MESSAGE_MODULE = 'Incorrect format of module reference'; private const ERROR_CODE_MODULE = 'WrongXMLModule'; private const FROM_CONTENT = 1; From 7b389222046074ffc4ac594b41faa26230f7c759 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 20 Sep 2021 09:37:23 +0200 Subject: [PATCH 21/99] Update Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php Co-authored-by: Sergii Ivashchenko --- .../Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index cbfc7b2b..db6950b3 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -16,7 +16,7 @@ class ClassReferencesInConfigurationFilesSniff implements Sniff private const ERROR_MESSAGE_CONFIG = 'Incorrect format of PHP class reference'; private const ERROR_CODE_CONFIG = 'IncorrectClassReference'; private const ERROR_MESSAGE_MODULE = 'Incorrect format of module reference'; - private const ERROR_CODE_MODULE = 'WrongXMLModule'; + private const ERROR_CODE_MODULE = 'InforrectModuleReference'; private const FROM_CONTENT = 1; private const FROM_NAME = 2; From 9a6963854e2e6ca074e2b64ef9b384885494eeb9 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 20 Sep 2021 09:37:43 +0200 Subject: [PATCH 22/99] Update Magento2/ruleset.xml Co-authored-by: Sergii Ivashchenko --- Magento2/ruleset.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 65d2cb3b..8e78cb06 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -121,7 +121,7 @@ *\/etc/wsdl2.xml$ *\/etc/wsi.xml$ 10 - warning + error From 936c28c187c3e336fa72a8b7c2be76cd17f0f03a Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Mon, 20 Sep 2021 10:11:43 +0200 Subject: [PATCH 23/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...assReferencesInConfigurationFilesSniff.php | 97 ++++++++++++------- Magento2/Sniffs/Legacy/ExtendedNode.php | 32 ------ 2 files changed, 60 insertions(+), 69 deletions(-) delete mode 100644 Magento2/Sniffs/Legacy/ExtendedNode.php diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index db6950b3..6255cfa0 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -16,11 +16,7 @@ class ClassReferencesInConfigurationFilesSniff implements Sniff private const ERROR_MESSAGE_CONFIG = 'Incorrect format of PHP class reference'; private const ERROR_CODE_CONFIG = 'IncorrectClassReference'; private const ERROR_MESSAGE_MODULE = 'Incorrect format of module reference'; - private const ERROR_CODE_MODULE = 'InforrectModuleReference'; - - private const FROM_CONTENT = 1; - private const FROM_NAME = 2; - private const FROM_ATTRIBUTE = 3; + private const ERROR_CODE_MODULE = 'IncorrectModuleReference'; /** * @inheritdoc @@ -59,7 +55,7 @@ public function process(File $phpcsFile, $stackPtr) $classes = $this->collectClassesInConfig($xml); $this->assertNonFactoryName($phpcsFile, $classes); - $modules = $this->getValuesFromXml($xml, '//@module', self::FROM_ATTRIBUTE, 'module'); + $modules = $this->getValuesFromXmlTagAttribute($xml, '//@module', 'module'); $this->assertNonFactoryNameModule($phpcsFile, $modules); } @@ -67,18 +63,18 @@ public function process(File $phpcsFile, $stackPtr) * Check whether specified class names are right according PSR-1 Standard. * * @param File $phpcsFile - * @param ExtendedNode[] $elements + * @param array $elements */ private function assertNonFactoryName(File $phpcsFile, array $elements) { foreach ($elements as $element) { - if (stripos($element->value, 'Magento') === false) { + if (stripos($element['value'], 'Magento') === false) { continue; } - if (preg_match('/^([A-Z][a-z\d\\\\]+)+$/', $element->value) !== 1) { + if (preg_match('/^([A-Z][a-z\d\\\\]+)+$/', $element['value']) !== 1) { $phpcsFile->addError( self::ERROR_MESSAGE_CONFIG, - $element->lineNumber - 1, + $element['lineNumber'], self::ERROR_CODE_CONFIG, ); } @@ -89,15 +85,15 @@ private function assertNonFactoryName(File $phpcsFile, array $elements) * Check whether specified class names in modules are right according PSR-1 Standard. * * @param File $phpcsFile - * @param ExtendedNode[] $classes + * @param array $classes */ private function assertNonFactoryNameModule(File $phpcsFile, array $classes) { foreach ($classes as $element) { - if (preg_match('/^([A-Z][A-Za-z\d_]+)+$/', $element->value) !== 1) { + if (preg_match('/^([A-Z][A-Za-z\d_]+)+$/', $element['value']) !== 1) { $phpcsFile->addError( self::ERROR_MESSAGE_MODULE, - $element->lineNumber - 1, + $element['lineNumber'], self::ERROR_CODE_MODULE, ); } @@ -126,45 +122,41 @@ private function getFormattedXML(File $phpcsFile) */ private function collectClassesInConfig(SimpleXMLElement $xml): array { - $classes = $this->getValuesFromXml( + $classes = $this->getValuesFromXmlTagContent( $xml, ' /config//resource_adapter | /config/*[not(name()="sections")]//class[not(ancestor::observers)] | //model[not(parent::connection)] | //backend_model | //source_model | //price_model | //model_token | //writer_model | //clone_model | //frontend_model | //working_model | //admin_renderer | //renderer', - self::FROM_CONTENT ); $classes = array_merge( $classes, - $this->getValuesFromXml( + $this->getValuesFromXmlTagAttribute( $xml, '//@backend_model', - self::FROM_ATTRIBUTE, 'backend_model' ) ); $classes = array_merge( $classes, - $this->getValuesFromXml( + $this->getValuesFromXmlTagAttribute( $xml, '/config//preference', - self::FROM_ATTRIBUTE, 'type' ) ); $classes = array_merge( $classes, - $this->getValuesFromXml( + $this->getValuesFromXmlTagName( $xml, '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/*', - self::FROM_NAME ) ); $classes = array_map( - function (ExtendedNode $extendedNode) { - $extendedNode->value = explode('::', trim($extendedNode->value))[0]; + function (array $extendedNode) { + $extendedNode['value'] = explode('::', trim($extendedNode['value']))[0]; return $extendedNode; }, $classes @@ -174,28 +166,59 @@ function (ExtendedNode $extendedNode) { } /** - * Extract value from the specified $extractFrom which exist in the XML path + * Extract value from tag contents which exist in the XML path + * + * @param SimpleXMLElement $xml + * @param string $xPath + * @return array + */ + private function getValuesFromXmlTagContent(SimpleXMLElement $xml, string $xPath): array + { + $nodes = $xml->xpath($xPath) ?: []; + return array_map(function ($item) { + return [ + 'value' => (string)$item, + 'lineNumber' => dom_import_simplexml($item)->getLineNo()-1, + ]; + }, $nodes); + } + + /** + * Extract value from tag names which exist in the XML path + * + * @param SimpleXMLElement $xml + * @param string $xPath + * @return array + */ + private function getValuesFromXmlTagName(SimpleXMLElement $xml, string $xPath): array + { + $nodes = $xml->xpath($xPath) ?: []; + return array_map(function ($item) { + return [ + 'value' => $item->getName(), + 'lineNumber' => dom_import_simplexml($item)->getLineNo()-1, + ]; + }, $nodes); + } + + /** + * Extract value from tag attributes which exist in the XML path * * @param SimpleXMLElement $xml * @param string $xPath - * @param int $extractFrom * @param string $attr * @return array */ - private function getValuesFromXml(SimpleXMLElement $xml, string $xPath, int $extractFrom, string $attr = ''): array + private function getValuesFromXmlTagAttribute(SimpleXMLElement $xml, string $xPath, string $attr): array { $nodes = $xml->xpath($xPath) ?: []; - return array_map(function ($item) use ($extractFrom, $attr) { - switch ($extractFrom) { - case self::FROM_CONTENT: - return new ExtendedNode((string)$item, $item); - case self::FROM_NAME: - return new ExtendedNode($item->getName(), $item); - case self::FROM_ATTRIBUTE: - $nodeArray = (array)$item; - if (isset($nodeArray['@attributes'][$attr])) { - return new ExtendedNode($nodeArray['@attributes'][$attr], $item); - } + return array_map(function ($item) use ($attr) { + $nodeArray = (array)$item; + if (isset($nodeArray['@attributes'][$attr])) { + return [ + 'value' => $nodeArray['@attributes'][$attr], + 'lineNumber' => dom_import_simplexml($item)->getLineNo()-1, + ]; } }, $nodes); } diff --git a/Magento2/Sniffs/Legacy/ExtendedNode.php b/Magento2/Sniffs/Legacy/ExtendedNode.php deleted file mode 100644 index 0320e63c..00000000 --- a/Magento2/Sniffs/Legacy/ExtendedNode.php +++ /dev/null @@ -1,32 +0,0 @@ -value = $value; - $this->lineNumber = dom_import_simplexml($element)->getLineNo(); - } -} From fbe2c1c05324a3289757c2390245143617b8eb5d Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 21 Sep 2021 10:46:12 +0200 Subject: [PATCH 24/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...assReferencesInConfigurationFilesSniff.php | 60 +++++++++ ...ferencesInConfigurationFilesUnitTest.5.xml | 116 ++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 6255cfa0..2a528edb 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -57,6 +57,12 @@ public function process(File $phpcsFile, $stackPtr) $modules = $this->getValuesFromXmlTagAttribute($xml, '//@module', 'module'); $this->assertNonFactoryNameModule($phpcsFile, $modules); + + $layouts = $this->collectClassesInLayout($xml); + $this->assertNonFactoryName($phpcsFile, $layouts); + + $layoutTabs = $this->collectClassesInLayoutTabs($xml); + $this->assertNonFactoryNameTab($phpcsFile, $layoutTabs); } /** @@ -100,6 +106,25 @@ private function assertNonFactoryNameModule(File $phpcsFile, array $classes) } } + /** + * Check whether specified class names in layout tabs are right according PSR-1 Standard. + * + * @param File $phpcsFile + * @param array $elements + */ + private function assertNonFactoryNameTab(File $phpcsFile, array $elements) + { + foreach ($elements as $element) { + if (preg_match('/\//', $element['value']) !== false) { + $phpcsFile->addError( + self::ERROR_MESSAGE_CONFIG, + $element['lineNumber'], + self::ERROR_CODE_CONFIG, + ); + } + } + } + /** * Format the incoming XML to avoid tags split into several lines. * @@ -165,6 +190,41 @@ function (array $extendedNode) { return $classes; } + private function collectClassesInLayout(SimpleXMLElement $xml): array + { + $classes = $this->getValuesFromXmlTagAttribute( + $xml, + '/layout//@helper', + 'helper' + ); + $classes = array_map( + function (array $extendedNode) { + $extendedNode['value'] = explode('::', trim($extendedNode['value']))[0]; + return $extendedNode; + }, + $classes + ); + $classes = array_merge( + $classes, + $this->getValuesFromXmlTagAttribute( + $xml, + '/layout//@module', + 'module' + ) + ); + + return $classes; + } + + private function collectClassesInLayoutTabs(SimpleXMLElement $xml): array + { + return $this->getValuesFromXmlTagContent( + $xml, + '/layout//action[@method="addTab"]/block', + ); + } + + /** * Extract value from tag contents which exist in the XML path * diff --git a/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml new file mode 100644 index 00000000..142ef2d1 --- /dev/null +++ b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Product + Item Status + Original Price + Price + Qty + Subtotal + Tax Amount + Tax Percent + Discount Amount + Row Total + + + + + + col-product + col-status + col-price-original + col-price + col-ordered-qty + col-subtotal + col-tax-amount + col-tax-percent + col-discont + col-total + + + + + + + + + + + + + + + + + + + + order_info + order_tab_info + + + + order_invoices + sales_order_invoice.grid.container + + + + + + + order_shipments + sales_order_shipment.grid.container + + + order_history + Magento\Sales\Block\Adminhtml\Order\View\Tab\History + + + + order_transactions + sales_transactions.grid.container + + + + + + + + + + + + + + + + + From 34169b2d6af24057c78eb27af0ba97164827c47c Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 21 Sep 2021 10:55:26 +0200 Subject: [PATCH 25/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../ClassReferencesInConfigurationFilesSniff.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 2a528edb..9bbd9f07 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -190,6 +190,12 @@ function (array $extendedNode) { return $classes; } + /** + * Parse an XML for references to PHP class names in selected tags or attributes + * + * @param SimpleXMLElement $xml + * @return array + */ private function collectClassesInLayout(SimpleXMLElement $xml): array { $classes = $this->getValuesFromXmlTagAttribute( @@ -206,7 +212,7 @@ function (array $extendedNode) { ); $classes = array_merge( $classes, - $this->getValuesFromXmlTagAttribute( + $this->getValuesFromXmlTagAttribute( $xml, '/layout//@module', 'module' @@ -216,6 +222,12 @@ function (array $extendedNode) { return $classes; } + /** + * Extract class references from layout tabs + * + * @param SimpleXMLElement $xml + * @return array + */ private function collectClassesInLayoutTabs(SimpleXMLElement $xml): array { return $this->getValuesFromXmlTagContent( @@ -224,7 +236,6 @@ private function collectClassesInLayoutTabs(SimpleXMLElement $xml): array ); } - /** * Extract value from tag contents which exist in the XML path * From 95f699c7ac2b227af55e04e1ea0308aa32011fa2 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Mon, 27 Sep 2021 16:08:39 +0200 Subject: [PATCH 26/99] AC-1314: Fix copyright sniff --- .../Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php b/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php index 1455ee58..31801890 100644 --- a/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php +++ b/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php @@ -7,6 +7,7 @@ namespace Magento2\Sniffs\Legacy; +use Magento2\Sniffs\Less\TokenizerSymbolsInterface; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; @@ -16,6 +17,8 @@ class CopyrightAnotherExtensionsFilesSniff implements Sniff private const COPYRIGHT_MAGENTO_TEXT = 'Copyright © Magento, Inc. All rights reserved.'; private const COPYRIGHT_ADOBE = '/Copyright \d+ Adobe/'; + + public $supportedTokenizers = [TokenizerSymbolsInterface::TOKENIZER_CSS, 'PHP']; /** * @inheritDoc @@ -23,7 +26,8 @@ class CopyrightAnotherExtensionsFilesSniff implements Sniff public function register(): array { return [ - T_INLINE_HTML + T_INLINE_HTML, + T_OPEN_TAG ]; } From 2c54b326cb2982c63fbe0ab31baa4d387179b5da Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Tue, 28 Sep 2021 09:40:43 +0200 Subject: [PATCH 27/99] AC-1314: Fix copyright sniff --- .../Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php b/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php index 31801890..a1d6995b 100644 --- a/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php +++ b/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php @@ -18,6 +18,11 @@ class CopyrightAnotherExtensionsFilesSniff implements Sniff private const COPYRIGHT_MAGENTO_TEXT = 'Copyright © Magento, Inc. All rights reserved.'; private const COPYRIGHT_ADOBE = '/Copyright \d+ Adobe/'; + /** + * Defines the tokenizers that this sniff is using. + * + * @var array + */ public $supportedTokenizers = [TokenizerSymbolsInterface::TOKENIZER_CSS, 'PHP']; /** From 1ba56bb139b355477ba323ccd2951f75b449e4db Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 29 Sep 2021 13:10:24 +0200 Subject: [PATCH 28/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Sniffs/Legacy/LayoutSniff.php | 446 +++++++++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/LayoutSniff.php diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php new file mode 100644 index 00000000..7341e87c --- /dev/null +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -0,0 +1,446 @@ + [ + 'adminhtml.permissions.user.edit.tabs', + 'adminhtml.permission.user.edit.tabs', + 'adminhtml.permissions.user.edit', + 'adminhtml.permission.user.edit', + 'adminhtml.permissions.user.roles.grid.js', + 'adminhtml.permission.user.roles.grid.js', + 'adminhtml.permissions.user.edit.tab.roles', + 'adminhtml.permissions.user.edit.tab.roles.js', + ], + 'adminhtml_user_role_index' => [ + 'adminhtml.permission.role.index', + 'adminhtml.permissions.role.index', + 'adminhtml.permissions.role.grid', + ], + 'adminhtml_user_role_rolegrid' => ['adminhtml.permission.role.grid', 'adminhtml.permissions.role.grid'], + 'adminhtml_user_role_editrole' => [ + 'adminhtml.permissions.editroles', + 'adminhtml.permissions.tab.rolesedit', + 'adminhtml.permission.roles.users.grid.js', + 'adminhtml.permissions.roles.users.grid.js', + 'adminhtml.permission.role.buttons', + 'adminhtml.permissions.role.buttons', + 'adminhtml.permission.role.edit.gws', + ], + 'adminhtml_user_role_editrolegrid' => [ + 'adminhtml.permission.role.grid.user', + 'adminhtml.permissions.role.grid.user', + ], + 'adminhtml_user_index' => ['adminhtml.permission.user.index', 'adminhtml.permissions.user.index'], + 'adminhtml_user_rolegrid' => [ + 'adminhtml.permissions.user.rolegrid', + 'adminhtml.permission.user.rolegrid', + ], + 'adminhtml_user_rolesgrid' => [ + 'adminhtml.permissions.user.rolesgrid', + 'adminhtml.permission.user.rolesgrid', + ], + ]; + + private $allowedActionNodeMethods = [ + 'addBodyClass', + 'addButtons', + 'addColumnCountLayoutDepend', + 'addCrumb', + 'addDatabaseBlock', + 'addInputTypeTemplate', + 'addNotice', + 'addReportTypeOption', + 'addTab', + 'addTabAfter', + 'addText', + 'append', + 'removeTab', + 'setActive', + 'setAddressType', + 'setAfterCondition', + 'setAfterTotal', + 'setAtCall', + 'setAtCode', + 'setAtLabel', + 'setAuthenticationStartMode', + 'setBeforeCondition', + 'setBlockId', + 'setBugreportUrl', + 'setCanLoadExtJs', + 'setCanLoadRulesJs', + 'setCanLoadTinyMce', + 'setClassName', + 'setColClass', + 'setColumnCount', + 'setColumnsLimit', + 'setCssClass', + 'setDefaultFilter', + 'setDefaultStoreName', + 'setDestElementId', + 'setDisplayArea', + 'setDontDisplayContainer', + 'setEmptyGridMessage', + 'setEntityModelClass', + 'setFieldOption', + 'setFieldVisibility', + 'setFormCode', + 'setFormId', + 'setFormPrefix', + 'setGiftRegistryTemplate', + 'setGiftRegistryUrl', + 'setGridHtmlClass', + 'setGridHtmlCss', + 'setGridHtmlId', + 'setHeaderTitle', + 'setHideBalance', + 'setHideLink', + 'setHideRequiredNotice', + 'setHtmlClass', + 'setId', + 'setImageType', + 'setImgAlt', + 'setImgHeight', + 'setImgSrc', + 'setImgWidth', + 'setInList', + 'setInfoTemplate', + 'setIsCollapsed', + 'setIsDisabled', + 'setIsEnabled', + 'setIsGuestNote', + 'setIsHandle', + 'setIsLinkMode', + 'setIsPlaneMode', + 'setIsTitleHidden', + 'setIsViewCurrent', + 'setItemLimit', + 'setLabel', + 'setLabelProperties', + 'setLayoutCode', + 'setLinkUrl', + 'setListCollection', + 'setListModes', + 'setListOrders', + 'setMAPTemplate', + 'setMethodFormTemplate', + 'setMyClass', + 'setPageLayout', + 'setPageTitle', + 'setParentType', + 'setControllerPath', + 'setPosition', + 'setPositioned', + 'setRewardMessage', + 'setRewardQtyLimitationMessage', + 'setShouldPrepareInfoTabs', + 'setShowPart', + 'setSignupLabel', + 'setSourceField', + 'setStoreVarName', + 'setStrong', + 'setTemplate', + 'setText', + 'setThemeName', + 'setTierPriceTemplate', + 'setTitle', + 'setTitleClass', + 'setTitleId', + 'setToolbarBlockName', + 'setType', + 'setUseConfirm', + 'setValueProperties', + 'setViewAction', + 'setViewColumn', + 'setViewLabel', + 'setViewMode', + 'setWrapperClass', + 'unsetChild', + 'unsetChildren', + 'updateButton', + 'setIsProductListingContext', + ]; + + /** + * @inheritdoc + */ + public function register(): array + { + return [ + T_INLINE_HTML + ]; + } + + /** + * @inheritDoc + */ + public function process(File $phpcsFile, $stackPtr) + { + if ($stackPtr > 0) { + return; + } + + $layout = simplexml_load_string($this->getFormattedXML($phpcsFile)); + + if ($layout === false) { + $phpcsFile->addError( + sprintf( + "Couldn't parse contents of '%s', check that they are in valid XML format", + $phpcsFile->getFilename(), + ), + $stackPtr, + self::ERROR_CODE_XML + ); + return; + } + + $this->testObsoleteReferences($layout, $phpcsFile); + $this->testObsoleteAttributes($layout, $phpcsFile); + $this->testHeadBlocks($layout, $phpcsFile); + $this->testOutputAttribute($layout, $phpcsFile); + $this->testHelperAttribute($layout, $phpcsFile); + $this->testListText($layout, $phpcsFile); + $this->testActionNodeMethods($layout, $phpcsFile); + //$this->testWithComponentRegistrar($layout, $phpcsFile); + } + + /** + * @param SimpleXMLElement $layout + * @param File $phpcsFile + */ + private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile) + { + foreach ($layout as $handle) { + if (!isset($this->_obsoleteReferences[$handle->getName()])) { + continue; + } + foreach ($handle->xpath('reference') as $reference) { + if (strpos((string)$reference['name'], $this->obsoleteReferences[$handle->getName()]) !== false) { + $phpcsFile->addError( + 'The block being referenced is removed.', + dom_import_simplexml($reference)->getLineNo(), + self::ERROR_CODE_OBSOLETE + ); + } + } + } + } + + /** + * Format the incoming XML to avoid tags split into several lines. + * + * @param File $phpcsFile + * @return false|string + */ + private function getFormattedXML(File $phpcsFile) + { + $doc = new DomDocument('1.0'); + $doc->formatOutput = true; + $doc->loadXML($phpcsFile->getTokensAsString(0, 999999)); + return $doc->saveXML(); + } + + /** + * @param SimpleXMLElement $layout + * @param File $phpcsFile + */ + private function testHeadBlocks(SimpleXMLElement $layout, File $phpcsFile) + { + $selectorHeadBlock = '(name()="block" or name()="referenceBlock") and ' . + '(@name="head" or @name="convert_root_head" or @name="vde_head")'; + $elements = $layout->xpath( + '//block[@class="Magento\Theme\Block\Html\Head\Css" ' . + 'or @class="Magento\Theme\Block\Html\Head\Link" ' . + 'or @class="Magento\Theme\Block\Html\Head\Script"]' . + '/parent::*[not(' . + $selectorHeadBlock . + ')]'); + if (!empty($elements)) { + $phpcsFile->addError( + 'Blocks \Magento\Theme\Block\Html\Head\{Css,Link,Script} ' . + 'are allowed within the "head" block only. ' . + 'Verify integrity of the nodes nesting.', + dom_import_simplexml($elements[0])->getLineNo(), + self::ERROR_CODE_NOT_ALLOWED + ); + }; + } + + /** + * @param SimpleXMLElement $layout + * @param File $phpcsFile + */ + private function testOutputAttribute(SimpleXMLElement $layout, File $phpcsFile): void + { + $elements = $layout->xpath('/layout//*[@output="toHtml"]'); + if (!empty($elements)) { + $phpcsFile->addError( + 'output="toHtml" is obsolete. Use output="1"', + dom_import_simplexml($elements[0])->getLineNo(), + self::ERROR_CODE_OBSOLETE + ); + }; + } + + /** + * Tests the attributes of the top-level Layout Node. + * Verifies there are no longer attributes of "parent" or "owner" + * + * @param SimpleXMLElement $layout + * @param File $phpcsFile + */ + private function testObsoleteAttributes(SimpleXMLElement $layout, File $phpcsFile) + { + $type = $layout['type']; + $parent = $layout['parent']; + $owner = $layout['owner']; + + if ((string)$type === 'page') { + if ($parent) { + $phpcsFile->addError( + 'Attribute "parent" is not valid', + dom_import_simplexml($parent)->getLineNo(), + self::ERROR_CODE_ATTRIBUTE_NOT_VALID + ); + } + } + if ((string)$type === 'fragment') { + if ($owner) { + $phpcsFile->addError( + 'Attribute "owner" is not valid', + dom_import_simplexml($owner)->getLineNo(), + self::ERROR_CODE_ATTRIBUTE_NOT_VALID + ); + } + } + } + + /** + * Returns attribute value by attribute name + * + * @param string $name + * @return string|null + */ + private function getAttribute(SimpleXMLElement $element, string $name): string + { + $attrs = $element->attributes(); + return isset($attrs[$name]) ? (string)$attrs[$name] : ''; + } + + /** + * @param SimpleXMLElement $layout + * @param File $phpcsFile + */ + private function testHelperAttribute(SimpleXMLElement $layout, File $phpcsFile): void + { + foreach ($layout->xpath('@helper') as $action) { + if (strpos($this->getAttribute($action, 'helper'), '/') !== false) { + $phpcsFile->addError( + "'helper' attribute contains '/'", + dom_import_simplexml($action)->getLineNo(), + self::ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_NOT_ALLOWED + ); + } + if (strpos($this->getAttribute($action, 'helper'), '::') === false) { + $phpcsFile->addError( + "'helper' attribute does not contain '::'", + dom_import_simplexml($action)->getLineNo(), + self::ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_EXPECTED + ); + } + } + } + + /** + * @param SimpleXMLElement $layout + * @param File $phpcsFile + */ + private function testListText(SimpleXMLElement $layout, File $phpcsFile): void + { + $elements = $layout->xpath('/layout//block[@class="Magento\Framework\View\Element\Text\ListText"]'); + if (!empty($elements)) { + $phpcsFile->addError( + 'The class \Magento\Framework\View\Element\Text\ListText' . + ' is not supposed to be used in layout anymore.', + dom_import_simplexml($elements[0])->getLineNo(), + self::ERROR_CODE_OBSOLETE_CLASS + ); + }; + } + + /** + * @param SimpleXMLElement $layout + * @param File $phpcsFile + */ + private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile) + { + $methodFilter = '@method!="' . implode('" and @method!="', $this->allowedActionNodeMethods) . '"'; + foreach ($layout->xpath('//action[' . $methodFilter . ']') as $node) { + $attributes = $node->attributes(); + $phpcsFile->addError( + sprintf( + 'Call of method "%s" via layout instruction is not allowed.', + $attributes['method'] + ), + dom_import_simplexml($node)->getLineNo(), + self::ERROR_CODE_METHOD_NOT_ALLOWED + ); + } + } + + private function testWithComponentRegistrar(SimpleXMLElement $layout, File $phpcsFile) + { + /* + * $componentRegistrar = new ComponentRegistrar(); + if (false !== strpos( + $layoutFile, + $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Sales') + . '/view/adminhtml/layout/sales_order' + ) || false !== strpos( + $layoutFile, + $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Shipping') + . '/view/adminhtml/layout/adminhtml_order' + ) + || false !== strpos( + $layoutFile, + $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Catalog') + . '/view/adminhtml/layout/catalog_product_grid.xml' + ) + ) { + $this->markTestIncomplete( + "The file {$layoutFile} has to use \\Magento\\Core\\Block\\Text\\List, \n" . + 'there is no solution to get rid of it right now.' + ); + } + */ + } +} From cc12906668f01b00ddeaab8e22d42b98b919d0fe Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 30 Sep 2021 15:20:34 +0200 Subject: [PATCH 29/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Sniffs/Legacy/LayoutSniff.php | 41 +----- Magento2/Tests/Legacy/LayoutUnitTest.1.xml | 157 +++++++++++++++++++++ Magento2/Tests/Legacy/LayoutUnitTest.2.xml | 29 ++++ Magento2/Tests/Legacy/LayoutUnitTest.3.xml | 27 ++++ Magento2/Tests/Legacy/LayoutUnitTest.php | 31 ++++ Magento2/ruleset.xml | 5 + 6 files changed, 256 insertions(+), 34 deletions(-) create mode 100644 Magento2/Tests/Legacy/LayoutUnitTest.1.xml create mode 100644 Magento2/Tests/Legacy/LayoutUnitTest.2.xml create mode 100644 Magento2/Tests/Legacy/LayoutUnitTest.3.xml create mode 100644 Magento2/Tests/Legacy/LayoutUnitTest.php diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index 7341e87c..716b8009 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -21,7 +21,7 @@ class LayoutSniff implements Sniff private const ERROR_CODE_OBSOLETE = 'Obsolete'; private const ERROR_CODE_OBSOLETE_CLASS = 'ObsoleteClass'; private const ERROR_CODE_ATTRIBUTE_NOT_VALID = 'AttributeNotValid'; - private const ERROR_CODE_METHOD_NOT_ALLOWED = 'MethodNot'; + private const ERROR_CODE_METHOD_NOT_ALLOWED = 'MethodNotAllowed'; private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_NOT_ALLOWED = 'CharacterNotAllowedInAttribute'; private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_EXPECTED = 'CharacterExpectedInAttribute'; @@ -230,14 +230,13 @@ public function process(File $phpcsFile, $stackPtr) $this->testHelperAttribute($layout, $phpcsFile); $this->testListText($layout, $phpcsFile); $this->testActionNodeMethods($layout, $phpcsFile); - //$this->testWithComponentRegistrar($layout, $phpcsFile); } /** * @param SimpleXMLElement $layout * @param File $phpcsFile */ - private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile) + private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile): void { foreach ($layout as $handle) { if (!isset($this->_obsoleteReferences[$handle->getName()])) { @@ -273,7 +272,7 @@ private function getFormattedXML(File $phpcsFile) * @param SimpleXMLElement $layout * @param File $phpcsFile */ - private function testHeadBlocks(SimpleXMLElement $layout, File $phpcsFile) + private function testHeadBlocks(SimpleXMLElement $layout, File $phpcsFile): void { $selectorHeadBlock = '(name()="block" or name()="referenceBlock") and ' . '(@name="head" or @name="convert_root_head" or @name="vde_head")'; @@ -315,10 +314,11 @@ private function testOutputAttribute(SimpleXMLElement $layout, File $phpcsFile): * Tests the attributes of the top-level Layout Node. * Verifies there are no longer attributes of "parent" or "owner" * + * @todo missing test * @param SimpleXMLElement $layout * @param File $phpcsFile */ - private function testObsoleteAttributes(SimpleXMLElement $layout, File $phpcsFile) + private function testObsoleteAttributes(SimpleXMLElement $layout, File $phpcsFile): void { $type = $layout['type']; $parent = $layout['parent']; @@ -362,7 +362,7 @@ private function getAttribute(SimpleXMLElement $element, string $name): string */ private function testHelperAttribute(SimpleXMLElement $layout, File $phpcsFile): void { - foreach ($layout->xpath('@helper') as $action) { + foreach ($layout->xpath('//*[@helper]') as $action) { if (strpos($this->getAttribute($action, 'helper'), '/') !== false) { $phpcsFile->addError( "'helper' attribute contains '/'", @@ -401,7 +401,7 @@ private function testListText(SimpleXMLElement $layout, File $phpcsFile): void * @param SimpleXMLElement $layout * @param File $phpcsFile */ - private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile) + private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile): void { $methodFilter = '@method!="' . implode('" and @method!="', $this->allowedActionNodeMethods) . '"'; foreach ($layout->xpath('//action[' . $methodFilter . ']') as $node) { @@ -416,31 +416,4 @@ private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile ); } } - - private function testWithComponentRegistrar(SimpleXMLElement $layout, File $phpcsFile) - { - /* - * $componentRegistrar = new ComponentRegistrar(); - if (false !== strpos( - $layoutFile, - $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Sales') - . '/view/adminhtml/layout/sales_order' - ) || false !== strpos( - $layoutFile, - $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Shipping') - . '/view/adminhtml/layout/adminhtml_order' - ) - || false !== strpos( - $layoutFile, - $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Catalog') - . '/view/adminhtml/layout/catalog_product_grid.xml' - ) - ) { - $this->markTestIncomplete( - "The file {$layoutFile} has to use \\Magento\\Core\\Block\\Text\\List, \n" . - 'there is no solution to get rid of it right now.' - ); - } - */ - } } diff --git a/Magento2/Tests/Legacy/LayoutUnitTest.1.xml b/Magento2/Tests/Legacy/LayoutUnitTest.1.xml new file mode 100644 index 00000000..f051284a --- /dev/null +++ b/Magento2/Tests/Legacy/LayoutUnitTest.1.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + Magento\Theme\ViewModel\Block\SessionConfig + + + + + + + + + + welcome + + + + + + + contentarea + + + + + + + + + contentarea + Skip to Content + + + + + Magento\Store\ViewModel\SwitcherUrlProvider + + + + + header links + + + + + + + + + + + + navigation-sections + nav-sections + + + + Menu + + + + + + Account + true + ]]> + + + + + Settings + + + + nav + Magento\Store\ViewModel\SwitcherUrlProvider + + + + + nav + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + footer links + + + + + + + + + + + + + + + + backend_login + + + 226 + + + 50 + + + + + diff --git a/Magento2/Tests/Legacy/LayoutUnitTest.2.xml b/Magento2/Tests/Legacy/LayoutUnitTest.2.xml new file mode 100644 index 00000000..04227a27 --- /dev/null +++ b/Magento2/Tests/Legacy/LayoutUnitTest.2.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Magento2/Tests/Legacy/LayoutUnitTest.3.xml b/Magento2/Tests/Legacy/LayoutUnitTest.3.xml new file mode 100644 index 00000000..bd34978b --- /dev/null +++ b/Magento2/Tests/Legacy/LayoutUnitTest.3.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + Magento_Paypal::hss/review/button.phtml + + + Magento_Paypal::hss/review/button.phtml + + + Magento_Paypal::hss/review/button.phtml + + + + + diff --git a/Magento2/Tests/Legacy/LayoutUnitTest.php b/Magento2/Tests/Legacy/LayoutUnitTest.php new file mode 100644 index 00000000..bca0c7c5 --- /dev/null +++ b/Magento2/Tests/Legacy/LayoutUnitTest.php @@ -0,0 +1,31 @@ +error *\.xml$ + + 10 + error + */view/(adminhtml|frontend|base)/*\/.xml + 9 From 5d04411f841bcf0ecde52414f93aa239d2a6fa3a Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 30 Sep 2021 15:25:03 +0200 Subject: [PATCH 30/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Tests/Legacy/LayoutUnitTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Magento2/Tests/Legacy/LayoutUnitTest.php b/Magento2/Tests/Legacy/LayoutUnitTest.php index bca0c7c5..c86ddee0 100644 --- a/Magento2/Tests/Legacy/LayoutUnitTest.php +++ b/Magento2/Tests/Legacy/LayoutUnitTest.php @@ -16,6 +16,21 @@ public function getErrorList($testFile = '') { if ($testFile === 'LayoutUnitTest.1.xml') { return [ + 23 => 1, + 146 => 1, + 149 => 1, + ]; + } + if ($testFile === 'LayoutUnitTest.2.xml') { + return [ + 12 => 1, + 29 => 1, + ]; + } + if ($testFile === 'LayoutUnitTest.3.xml') { + return [ + 16 => 1, + 19 => 1, ]; } return []; From f16142d83448a2af3286139f9fce9f8c45632b0d Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 30 Sep 2021 15:31:10 +0200 Subject: [PATCH 31/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/ruleset.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 4d0aa268..c130fa82 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -144,7 +144,7 @@ error *\.xml$ - + 10 error */view/(adminhtml|frontend|base)/*\/.xml From f7f1a0dbdd62083c0315ca123628d02357085813 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 30 Sep 2021 15:42:22 +0200 Subject: [PATCH 32/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Sniffs/Legacy/LayoutSniff.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index 716b8009..1515cc38 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -71,6 +71,11 @@ class LayoutSniff implements Sniff ], ]; + /** + * List of allowed method names + * + * @var string[] + */ private $allowedActionNodeMethods = [ 'addBodyClass', 'addButtons', @@ -233,6 +238,9 @@ public function process(File $phpcsFile, $stackPtr) } /** + * Check for obsolete block references + * + * @todo missing test * @param SimpleXMLElement $layout * @param File $phpcsFile */ @@ -269,6 +277,8 @@ private function getFormattedXML(File $phpcsFile) } /** + * Check that CSS, Link and Script blocks are inside a head block + * * @param SimpleXMLElement $layout * @param File $phpcsFile */ @@ -295,6 +305,8 @@ private function testHeadBlocks(SimpleXMLElement $layout, File $phpcsFile): void } /** + * Check that the output attribute has the right value + * * @param SimpleXMLElement $layout * @param File $phpcsFile */ @@ -347,6 +359,7 @@ private function testObsoleteAttributes(SimpleXMLElement $layout, File $phpcsFil /** * Returns attribute value by attribute name * + * @param SimpleXMLElement $element * @param string $name * @return string|null */ @@ -357,6 +370,8 @@ private function getAttribute(SimpleXMLElement $element, string $name): string } /** + * Check values in helper attributes + * * @param SimpleXMLElement $layout * @param File $phpcsFile */ @@ -381,6 +396,8 @@ private function testHelperAttribute(SimpleXMLElement $layout, File $phpcsFile): } /** + * Check that ListText is not used + * * @param SimpleXMLElement $layout * @param File $phpcsFile */ @@ -398,6 +415,8 @@ private function testListText(SimpleXMLElement $layout, File $phpcsFile): void } /** + * Check that action is calling an allowed method + * * @param SimpleXMLElement $layout * @param File $phpcsFile */ From 98cf89383dfff968d8ed558eafcb8dc83db3f5ab Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 30 Sep 2021 15:44:56 +0200 Subject: [PATCH 33/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Sniffs/Legacy/LayoutSniff.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index 1515cc38..d4f3e16f 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -292,7 +292,8 @@ private function testHeadBlocks(SimpleXMLElement $layout, File $phpcsFile): void 'or @class="Magento\Theme\Block\Html\Head\Script"]' . '/parent::*[not(' . $selectorHeadBlock . - ')]'); + ')]' + ); if (!empty($elements)) { $phpcsFile->addError( 'Blocks \Magento\Theme\Block\Html\Head\{Css,Link,Script} ' . @@ -323,8 +324,7 @@ private function testOutputAttribute(SimpleXMLElement $layout, File $phpcsFile): } /** - * Tests the attributes of the top-level Layout Node. - * Verifies there are no longer attributes of "parent" or "owner" + * Tests the attributes of the top-level Layout Node. Verifies there are no longer attributes of "parent" or "owner" * * @todo missing test * @param SimpleXMLElement $layout From 4929b1aeab4885a99e9c894647a1298a6801db4f Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 30 Sep 2021 17:10:48 +0200 Subject: [PATCH 34/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Sniffs/Legacy/LayoutSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index d4f3e16f..8731c03a 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -247,7 +247,7 @@ public function process(File $phpcsFile, $stackPtr) private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile): void { foreach ($layout as $handle) { - if (!isset($this->_obsoleteReferences[$handle->getName()])) { + if (!isset($this->obsoleteReferences[$handle->getName()])) { continue; } foreach ($handle->xpath('reference') as $reference) { From a7a82f95ed411d2a7ed932654d902746caf5a775 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Tue, 5 Oct 2021 15:07:51 +0200 Subject: [PATCH 35/99] AC-681: Create phpcs static check for PhtmlTemplateTest --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 136 ++++++++++++++++++ .../Tests/Legacy/PhtmlTemplateUnitTest.php | 82 +++++++++++ .../templates/PhtmlTemplateUnitTest.3.phtml | 41 ++++++ .../templates/PhtmlTemplateUnitTest.1.phtml | 41 ++++++ .../templates/PhtmlTemplateUnitTest.2.phtml | 41 ++++++ Magento2/ruleset.xml | 5 + 6 files changed, 346 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php create mode 100644 Magento2/Tests/Legacy/PhtmlTemplateUnitTest.php create mode 100644 Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml create mode 100644 Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml create mode 100644 Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php new file mode 100644 index 00000000..d9909c68 --- /dev/null +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -0,0 +1,136 @@ + 'Please do not use "jquery/ui" library in templates. Use needed jquery ' . + 'ui widget instead.', + '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'Please do not initialize JS component in php. Do ' . + 'it in template.', + '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'Please do not initialize JS component ' . + 'in php. Do it in template.', + ]; + + /** + * @inheritdoc + */ + public function register(): array + { + return [ + T_OBJECT_OPERATOR, + T_INLINE_HTML, + T_HEREDOC + ]; + } + + /** + * @inheritdoc + */ + public function process(File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + if ($tokens[$stackPtr]['code'] === T_OBJECT_OPERATOR) { + $this->checkBlockVariable($phpcsFile, $stackPtr, $tokens); + $this->checkThisVariable($phpcsFile, $stackPtr, $tokens); + } + if ($tokens[$stackPtr]['code'] === T_INLINE_HTML || $tokens[$stackPtr]['code'] === T_HEREDOC) { + $this->checkHtml($phpcsFile, $stackPtr); + + $file = $phpcsFile->getFilename(); + + if (strpos($file, '/view/frontend/templates/') !== false + || strpos($file, '/view/base/templates/') !== false + ) { + $this->checkHtmlSpecificFiles($phpcsFile, $stackPtr); + } + } + } + + /** + * @param File $phpcsFile + * @param int $stackPtr + * @param array $tokens + */ + private function checkBlockVariable(File $phpcsFile, int $stackPtr, array $tokens): void + { + $varPos = $phpcsFile->findPrevious(T_VARIABLE, $stackPtr - 1); + if ($tokens[$varPos]['content'] !== '$block') { + return; + } + $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); + if (strpos($tokens[$stringPos]['content'], '_') === 0) { + $phpcsFile->addWarning( + 'Access to protected and private members of Block class is ' . + 'obsolete in phtml templates. Use only public members.', + $stringPos, + self::WARNING_CODE + ); + } + } + + /** + * @param File $phpcsFile + * @param int $stackPtr + * @param array $tokens + */ + private function checkThisVariable(File $phpcsFile, int $stackPtr, array $tokens): void + { + $varPos = $phpcsFile->findPrevious(T_VARIABLE, $stackPtr - 1); + if ($tokens[$varPos]['content'] !== '$this') { + return; + } + $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); + if (strpos($tokens[$stringPos]['content'], 'helper') === false) { + $phpcsFile->addWarning( + 'Access to members and methods of Block class through $this is ' . + 'obsolete in phtml templates. Use only $block instead of $this.', + $stringPos, + self::WARNING_CODE + ); + } + } + + /** + * @param File $phpcsFile + * @param int $stackPtr + */ + private function checkHtml(File $phpcsFile, int $stackPtr): void + { + $content = $phpcsFile->getTokensAsString($stackPtr, 1); + + if (preg_match('/type="text\/javascript"/', $content)) { + $phpcsFile->addWarning( + 'Please do not use "text/javascript" type attribute.', + $stackPtr, + self::WARNING_CODE + ); + } + } + + /** + * @param File $phpcsFile + * @param int $stackPtr + */ + private function checkHtmlSpecificFiles(File $phpcsFile, int $stackPtr): void + { + $content = $phpcsFile->getTokensAsString($stackPtr, 1); + + foreach (self::OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES as $obsoleteRegex => $errorMessage) { + if (preg_match($obsoleteRegex, $content)) { + $phpcsFile->addWarning( + $errorMessage, + $stackPtr, + self::WARNING_CODE + ); + } + } + } + +} diff --git a/Magento2/Tests/Legacy/PhtmlTemplateUnitTest.php b/Magento2/Tests/Legacy/PhtmlTemplateUnitTest.php new file mode 100644 index 00000000..46417690 --- /dev/null +++ b/Magento2/Tests/Legacy/PhtmlTemplateUnitTest.php @@ -0,0 +1,82 @@ +isDir()) { + continue; + } + $path = $file->getPathname(); + if ($path !== $testFileBase.'php' && substr($path, -5) !== 'fixed' && substr($path, -4) !== '.bak') { + $testFiles[] = $path; + } + } + + // Put them in order. + sort($testFiles); + + return $testFiles; + } + + /** + * @inheritdoc + */ + public function getErrorList() + { + return []; + } + + /** + * @inheritdoc + */ + public function getWarningList($testFile = '') + { + if ($testFile === 'PhtmlTemplateUnitTest.1.phtml' || $testFile === 'PhtmlTemplateUnitTest.2.phtml') { + return [ + 7 => 1, + 9 => 1, + 13 => 1, + 20 => 1, + 22 => 1, + 23 => 1, + 27 => 1, + 33 => 1, + 39 => 1 + ]; + } + if ($testFile === 'PhtmlTemplateUnitTest.3.phtml') + { + return [ + 9 => 1, + 20 => 1, + 22 => 1, + 23 => 1, + 27 => 1, + ]; + } + return []; + } +} diff --git a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml new file mode 100644 index 00000000..c9759f58 --- /dev/null +++ b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml @@ -0,0 +1,41 @@ + + + +
+_getTestFunction(); +$block->getTestFunction(); +$_something = $this->something(); +$block->_getTest(); +$block = _testing(); +?> +_getTestAnotherFunction(); +?> + +helper(); +?> + + \ No newline at end of file diff --git a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml new file mode 100644 index 00000000..c9759f58 --- /dev/null +++ b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml @@ -0,0 +1,41 @@ + + + +
+_getTestFunction(); +$block->getTestFunction(); +$_something = $this->something(); +$block->_getTest(); +$block = _testing(); +?> +_getTestAnotherFunction(); +?> + +helper(); +?> + + \ No newline at end of file diff --git a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml new file mode 100644 index 00000000..c9759f58 --- /dev/null +++ b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml @@ -0,0 +1,41 @@ + + + +
+_getTestFunction(); +$block->getTestFunction(); +$_something = $this->something(); +$block->_getTest(); +$block = _testing(); +?> +_getTestAnotherFunction(); +?> + +helper(); +?> + + \ No newline at end of file diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 852a70da..d45aa30f 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -302,6 +302,11 @@ 8 warning + + *\.phtml$ + 8 + warning + From a5dff74183a28bc11aeca87a6ea7d3bfe2617284 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Tue, 5 Oct 2021 15:17:16 +0200 Subject: [PATCH 36/99] AC-681: Create phpcs static check for PhtmlTemplateTest --- .../view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml | 1 - .../view/base/templates/PhtmlTemplateUnitTest.1.phtml | 1 - .../view/frontend/templates/PhtmlTemplateUnitTest.2.phtml | 1 - 3 files changed, 3 deletions(-) diff --git a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml index c9759f58..772783c9 100644 --- a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml +++ b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/adminhtml/templates/PhtmlTemplateUnitTest.3.phtml @@ -38,4 +38,3 @@ $this->helper(); ?> - \ No newline at end of file diff --git a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml index c9759f58..772783c9 100644 --- a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml +++ b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/base/templates/PhtmlTemplateUnitTest.1.phtml @@ -38,4 +38,3 @@ $this->helper(); ?> - \ No newline at end of file diff --git a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml index c9759f58..772783c9 100644 --- a/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml +++ b/Magento2/Tests/Legacy/_files/PhtmlTemplateUnitTest/view/frontend/templates/PhtmlTemplateUnitTest.2.phtml @@ -38,4 +38,3 @@ $this->helper(); ?> - \ No newline at end of file From 203e8af1e3aa67fe196e3c661911efae30652420 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Tue, 5 Oct 2021 15:28:11 +0200 Subject: [PATCH 37/99] AC-681: Create phpcs static check for PhtmlTemplateTest --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index d9909c68..431b6f00 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -10,11 +10,11 @@ class PhtmlTemplateSniff implements Sniff private const WARNING_CODE = 'PhtmlTemplateObsolete'; private const OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ - '/(["\'])jquery\/ui\1/' => 'Please do not use "jquery/ui" library in templates. Use needed jquery ' . + '/(["\'])jquery\/ui\1/' => 'Please do not use "jquery/ui" library in templates. Use needed jquery ' . 'ui widget instead.', - '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'Please do not initialize JS component in php. Do ' . + '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'Please do not initialize JS component in php. Do ' . 'it in template.', - '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'Please do not initialize JS component ' . + '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'Please do not initialize JS component ' . 'in php. Do it in template.', ]; @@ -54,6 +54,8 @@ public function process(File $phpcsFile, $stackPtr) } /** + * Check access to protected and private members of Block + * * @param File $phpcsFile * @param int $stackPtr * @param array $tokens @@ -76,6 +78,8 @@ private function checkBlockVariable(File $phpcsFile, int $stackPtr, array $token } /** + * Check access to members and methods of Block class through $this + * * @param File $phpcsFile * @param int $stackPtr * @param array $tokens @@ -98,6 +102,8 @@ private function checkThisVariable(File $phpcsFile, int $stackPtr, array $tokens } /** + * Check use of "text/javascript" type + * * @param File $phpcsFile * @param int $stackPtr */ @@ -115,6 +121,8 @@ private function checkHtml(File $phpcsFile, int $stackPtr): void } /** + * Check of some obsoletes uses in specific files + * * @param File $phpcsFile * @param int $stackPtr */ @@ -132,5 +140,4 @@ private function checkHtmlSpecificFiles(File $phpcsFile, int $stackPtr): void } } } - } From a43949d3017309575d67e55dc6ce97d3267490c0 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Tue, 5 Oct 2021 15:29:54 +0200 Subject: [PATCH 38/99] AC-681: Create phpcs static check for PhtmlTemplateTest --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index 431b6f00..2b730768 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -55,7 +55,7 @@ public function process(File $phpcsFile, $stackPtr) /** * Check access to protected and private members of Block - * + * * @param File $phpcsFile * @param int $stackPtr * @param array $tokens @@ -79,7 +79,7 @@ private function checkBlockVariable(File $phpcsFile, int $stackPtr, array $token /** * Check access to members and methods of Block class through $this - * + * * @param File $phpcsFile * @param int $stackPtr * @param array $tokens @@ -103,7 +103,7 @@ private function checkThisVariable(File $phpcsFile, int $stackPtr, array $tokens /** * Check use of "text/javascript" type - * + * * @param File $phpcsFile * @param int $stackPtr */ @@ -122,7 +122,7 @@ private function checkHtml(File $phpcsFile, int $stackPtr): void /** * Check of some obsoletes uses in specific files - * + * * @param File $phpcsFile * @param int $stackPtr */ From 70a747c2651115b6d40a0c0995487630c2426dc8 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Tue, 5 Oct 2021 17:58:40 +0200 Subject: [PATCH 39/99] AC-681: Create phpcs static check for PhtmlTemplateTest --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index 2b730768..67d74575 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -1,4 +1,9 @@ Date: Wed, 6 Oct 2021 11:20:46 +0200 Subject: [PATCH 40/99] AC-1167: Update DiscouragedFunctionSniff with FilesystemDriverInterface functions --- .../Functions/DiscouragedFunctionSniff.php | 9 +++++++++ .../Functions/DiscouragedFunctionUnitTest.inc | 18 ++++++++++++++++++ .../Functions/DiscouragedFunctionUnitTest.php | 11 ++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Functions/DiscouragedFunctionSniff.php b/Magento2/Sniffs/Functions/DiscouragedFunctionSniff.php index e73e981a..4982f8cc 100644 --- a/Magento2/Sniffs/Functions/DiscouragedFunctionSniff.php +++ b/Magento2/Sniffs/Functions/DiscouragedFunctionSniff.php @@ -229,5 +229,14 @@ class DiscouragedFunctionSniff extends ForbiddenFunctionsSniff '^strval$' => '(string) construction', '^htmlspecialchars$' => '\Magento\Framework\Escaper->escapeHtml', '^getimagesize$' => 'getimagesizefromstring', + '^file_exists$' => 'Magento\Framework\Filesystem\DriverInterface::isExists()', + '^file_get_contents$' => 'Magento\Framework\Filesystem\DriverInterface::fileGetContents()', + '^file_put_contents$' => 'Magento\Framework\Filesystem\DriverInterface::filePutContents()', + '^fgetcsv$' => 'Magento\Framework\Filesystem\DriverInterface::fileGetCsv()', + '^fputcsv$' => 'Magento\Framework\Filesystem\DriverInterface::filePutCsv()', + '^ftell$' => 'Magento\Framework\Filesystem\DriverInterface::fileTell()', + '^fseek$' => 'Magento\Framework\Filesystem\DriverInterface::fileSeek()', + '^feof$' => 'Magento\Framework\Filesystem\DriverInterface::endOfFile()', + '^flock$' => 'Magento\Framework\Filesystem\DriverInterface::fileLock()', ]; } diff --git a/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.inc b/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.inc index 5abf6dd5..0302ff56 100644 --- a/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.inc +++ b/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.inc @@ -464,3 +464,21 @@ $str = chop($text, 'ttt'); md5($text); htmlspecialchars('text'); + +file_exists('./'); + +file_get_contents('file.txt'); + +file_put_contents($file, 'test'); + +fgetcsv($fp,'r'); + +fputcsv($fp, $fields); + +ftell($file); + +fseek($file, 0); + +feof($fp); + +flock($fp, LOCK_EX); diff --git a/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.php b/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.php index 983a87b6..2a30100e 100644 --- a/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.php +++ b/Magento2/Tests/Functions/DiscouragedFunctionUnitTest.php @@ -246,7 +246,16 @@ public function getWarningList() 458 => 1, 460 => 1, 462 => 1, - 466 => 1 + 466 => 1, + 468 => 1, + 470 => 1, + 472 => 1, + 474 => 1, + 476 => 1, + 478 => 1, + 480 => 1, + 482 => 1, + 484 => 1 ]; } } From bf6420569a35a1905996e7585159a7cd71e3ce51 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 6 Oct 2021 15:12:23 +0200 Subject: [PATCH 41/99] AC-683: Create phpcs static check for TableTest --- Magento2/Sniffs/Legacy/TableNameSniff.php | 234 ++++++++++++++++++++ Magento2/Tests/Legacy/TableNameUnitTest.inc | 39 ++++ Magento2/Tests/Legacy/TableNameUnitTest.php | 32 +++ 3 files changed, 305 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/TableNameSniff.php create mode 100644 Magento2/Tests/Legacy/TableNameUnitTest.inc create mode 100644 Magento2/Tests/Legacy/TableNameUnitTest.php diff --git a/Magento2/Sniffs/Legacy/TableNameSniff.php b/Magento2/Sniffs/Legacy/TableNameSniff.php new file mode 100644 index 00000000..9181909f --- /dev/null +++ b/Magento2/Sniffs/Legacy/TableNameSniff.php @@ -0,0 +1,234 @@ + [0], + '_setMainTable' => [0], + 'setMainTable' => [0], + 'getTable' => [0], + 'setTable' => [0], + 'getTableRow' => [0], + 'deleteTableRow' => [0], + 'updateTableRow' => [0], + 'updateTable' => [0], + 'tableExists' => [0], + 'joinField' => [1], + 'joinTable' => [0], + 'getFkName' => [0, 2], + 'getIdxName' => [0], + 'addVirtualGridColumn' => [1], + ]; + + /** + * String representation of error. + * + * @var string + */ + private const ERROR_MESSAGE = 'Legacy table names with slash must be fixed to direct table names. Found: %s'; + + /** + * Error violation code. + * + * @var string + */ + private const ERROR_CODE = 'FoundLegacyTableName'; + + /** + * @inheritdoc + */ + public function register() + { + return [ + T_OBJECT_OPERATOR, + T_VARIABLE, + T_DOUBLE_ARROW + ]; + } + + /** + * @inheritdoc + */ + public function process(File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + if ($tokens[$stackPtr]['code'] === T_OBJECT_OPERATOR) { + $this->checkOccurrencesInMethods($phpcsFile, $stackPtr, $tokens); + } elseif ($tokens[$stackPtr]['code'] === T_DOUBLE_ARROW) { + $this->checkOccurrencesInArray($phpcsFile, $stackPtr, $tokens); + } else { + $this->checkOccurrencesInProperty($phpcsFile, $stackPtr, $tokens); + } + } + + /** + * Check if passed file is a resource but not a collection + * + * @param string $filePath + * @return bool + */ + private function isResourceButNotCollection(string $filePath): bool + { + $filePath = str_replace('\\', '/', $filePath); + $parts = explode('/', $filePath); + return array_search('Resource', $parts) !== false && array_search('Collection.php', $parts) === false; + } + + /** + * Check references to table names in methods + * + * @param File $phpcsFile + * @param int $stackPtr + * @param array $tokens + */ + private function checkOccurrencesInMethods(File $phpcsFile, int $stackPtr, array $tokens): void + { + $methodNamePos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); + $methodName = $tokens[$methodNamePos]['content']; + if (array_key_exists($methodName, $this->argPositionInMethods) === false) { + return; + } + $firstArgumentPos = $phpcsFile->findNext([T_CONSTANT_ENCAPSED_STRING, T_VARIABLE], $methodNamePos + 1); + + foreach ($this->argPositionInMethods[$methodName] as $argPosition) { + $paramPos = $firstArgumentPos; + for ($i = 0; $i < $argPosition; $i++) { + $paramPos = $phpcsFile->findNext( + [T_CONSTANT_ENCAPSED_STRING, T_VARIABLE], + $paramPos + 1, + $phpcsFile->findNext(T_CLOSE_PARENTHESIS, $paramPos + 1) + ); + } + if (strpos($tokens[$paramPos]['content'], '/') !== false) { + $phpcsFile->addError( + sprintf( + self::ERROR_MESSAGE, + $tokens[$paramPos]['content'], + ), + $paramPos, + self::ERROR_CODE + ); + } + } + + if ($this->isResourceButNotCollection($phpcsFile->getFilename())) { + if ($tokens[$stackPtr]['content'] !== '_init') { + return; + } + + $paramPos = $phpcsFile->findNext(T_PARAM_NAME, $stackPtr + 1); + if (strpos($tokens[$paramPos]['content'], '/') !== false) { + $phpcsFile->addError( + sprintf( + self::ERROR_MESSAGE, + $tokens[$paramPos]['content'], + ), + $paramPos, + self::ERROR_CODE + ); + } + } + } + + /** + * Check references to table names in the $_aggregationTable property + * + * @param File $phpcsFile + * @param int $stackPtr + * @param array $tokens + */ + private function checkOccurrencesInProperty(File $phpcsFile, int $stackPtr, array $tokens): void + { + if ($methodName = $tokens[$stackPtr]['content'] !== '$_aggregationTable') { + return; + } + + $tableNamePos = $phpcsFile->findNext( + T_CONSTANT_ENCAPSED_STRING, + $stackPtr + 1, + $phpcsFile->findEndOfStatement($stackPtr + 1) + ); + + if (strpos($tokens[$tableNamePos]['content'], '/') !== false) { + $phpcsFile->addError( + sprintf( + self::ERROR_MESSAGE, + $tokens[$tableNamePos]['content'], + ), + $tableNamePos, + self::ERROR_CODE + ); + } + } + + /** + * Check references to table names in arrays + * + * @param File $phpcsFile + * @param int $stackPtr + * @param array $tokens + */ + private function checkOccurrencesInArray(File $phpcsFile, int $stackPtr, array $tokens): void + { + $aliasPos = $phpcsFile->findPrevious( + T_CONSTANT_ENCAPSED_STRING, + $stackPtr -1 + ); + + $alias = trim($tokens[$aliasPos]['content'], '\'"'); + + if ($this->endsWith($alias, '_table') === false) { + return; + } + + $tableNamePos = $phpcsFile->findNext( + T_CONSTANT_ENCAPSED_STRING, + $aliasPos + 1 + ); + + if (strpos($tokens[$tableNamePos]['content'], '/') !== false) { + $phpcsFile->addError( + sprintf( + self::ERROR_MESSAGE, + $tokens[$tableNamePos]['content'], + ), + $tableNamePos, + self::ERROR_CODE + ); + } + } + + /** + * Checks if $haystack ends with $needle + * + * @param string $haystack + * @param string $needle + * @return bool + */ + private function endsWith(string $haystack, string $needle): bool + { + $length = strlen($needle); + if ($length === 0) { + return true; + } + return substr($haystack, -$length) === $needle; + } +} diff --git a/Magento2/Tests/Legacy/TableNameUnitTest.inc b/Magento2/Tests/Legacy/TableNameUnitTest.inc new file mode 100644 index 00000000..a1f2520e --- /dev/null +++ b/Magento2/Tests/Legacy/TableNameUnitTest.inc @@ -0,0 +1,39 @@ +_resource->getTableName('/catalog_category_product'); + +$collection->joinField( + 'inventory_in_stock', + '/cataloginventory_stock_item', + 'is_in_stock', + 'product_id=entity_id', + '(' . join(') OR (', $cond) . ')' +); + +$collection->getFkName( + 'inventory_in_stock', + $collection, + '/is_in_stock' +); + +$select = $connection->select()->from( + ['main_table' => 'magento/sample_table'] +); + +$select = $connection->select()->from( + ['main_table_name' => 'magento/sample_table'] +); + +$select = $connection->select()->from( + ['main_table' => 'magento_sample_table'] +); + +class Collection extends \Magento\Sales\Model\ResourceModel\Report\Order\Collection +{ + /** + * Aggregated Data Table + * + * @var string + */ + protected $_aggregationTable = 'magento/sales_order_aggregated_updated'; +} \ No newline at end of file diff --git a/Magento2/Tests/Legacy/TableNameUnitTest.php b/Magento2/Tests/Legacy/TableNameUnitTest.php new file mode 100644 index 00000000..94eb10bc --- /dev/null +++ b/Magento2/Tests/Legacy/TableNameUnitTest.php @@ -0,0 +1,32 @@ + 1, + 7 => 1, + 14 => 1, + 28 => 1,*/ + ]; + } + + /** + * @inheritdoc + */ + public function getWarningList($testFile = '') + { + return []; + } +} From eb3ad4749a6f9fa56548ade1804dd281d186fdac Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 6 Oct 2021 15:44:19 +0200 Subject: [PATCH 42/99] AC-683: Create phpcs static check for TableTest --- Magento2/Tests/Legacy/TableNameUnitTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Magento2/Tests/Legacy/TableNameUnitTest.php b/Magento2/Tests/Legacy/TableNameUnitTest.php index 94eb10bc..4cfade20 100644 --- a/Magento2/Tests/Legacy/TableNameUnitTest.php +++ b/Magento2/Tests/Legacy/TableNameUnitTest.php @@ -15,10 +15,11 @@ class TableNameUnitTest extends AbstractSniffUnitTest public function getErrorList($testFile = '') { return [ - /*3 => 1, + 3 => 1, 7 => 1, 14 => 1, - 28 => 1,*/ + 20 => 1, + 28 => 1, ]; } From a1c933a4c19c0c4a5f06df818475aa8067f136be Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 6 Oct 2021 15:47:09 +0200 Subject: [PATCH 43/99] AC-683: Create phpcs static check for TableTest --- Magento2/Tests/Legacy/TableNameUnitTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Magento2/Tests/Legacy/TableNameUnitTest.php b/Magento2/Tests/Legacy/TableNameUnitTest.php index 4cfade20..eec07bfe 100644 --- a/Magento2/Tests/Legacy/TableNameUnitTest.php +++ b/Magento2/Tests/Legacy/TableNameUnitTest.php @@ -17,9 +17,9 @@ public function getErrorList($testFile = '') return [ 3 => 1, 7 => 1, - 14 => 1, + 16 => 1, 20 => 1, - 28 => 1, + 38 => 1, ]; } From 1452ed3dd49f11b2b7743048595e19e02e45f402 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 6 Oct 2021 16:03:05 +0200 Subject: [PATCH 44/99] AC-683: Create phpcs static check for TableTest --- Magento2/Sniffs/Legacy/TableNameSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/TableNameSniff.php b/Magento2/Sniffs/Legacy/TableNameSniff.php index 9181909f..b9a9081f 100644 --- a/Magento2/Sniffs/Legacy/TableNameSniff.php +++ b/Magento2/Sniffs/Legacy/TableNameSniff.php @@ -114,7 +114,7 @@ private function checkOccurrencesInMethods(File $phpcsFile, int $stackPtr, array $paramPos = $phpcsFile->findNext( [T_CONSTANT_ENCAPSED_STRING, T_VARIABLE], $paramPos + 1, - $phpcsFile->findNext(T_CLOSE_PARENTHESIS, $paramPos + 1) + $phpcsFile->findNext(T_CLOSE_PARENTHESIS, $paramPos + 1) ); } if (strpos($tokens[$paramPos]['content'], '/') !== false) { From ceeba5613137c69a0ec0d8f86af56b5948c7a873 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 6 Oct 2021 17:02:31 +0200 Subject: [PATCH 45/99] AC-683: Create phpcs static check for TableTest --- Magento2/Tests/Legacy/TableNameUnitTest.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Tests/Legacy/TableNameUnitTest.inc b/Magento2/Tests/Legacy/TableNameUnitTest.inc index a1f2520e..d3b46079 100644 --- a/Magento2/Tests/Legacy/TableNameUnitTest.inc +++ b/Magento2/Tests/Legacy/TableNameUnitTest.inc @@ -36,4 +36,4 @@ class Collection extends \Magento\Sales\Model\ResourceModel\Report\Order\Collect * @var string */ protected $_aggregationTable = 'magento/sales_order_aggregated_updated'; -} \ No newline at end of file +} From eda77b3d5d1ed780560c295ef280003cff6aa261 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 7 Oct 2021 10:53:49 +0200 Subject: [PATCH 46/99] AC-676: Create phpcs static check for ObsoleteConnectionTest --- .../Sniffs/Legacy/ObsoleteConnectionSniff.php | 71 +++++++++++++++++++ .../Legacy/ObsoleteConnectionUnitTest.inc | 36 ++++++++++ .../Legacy/ObsoleteConnectionUnitTest.php | 36 ++++++++++ 3 files changed, 143 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php create mode 100644 Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.inc create mode 100644 Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php diff --git a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php new file mode 100644 index 00000000..ac48af93 --- /dev/null +++ b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php @@ -0,0 +1,71 @@ +validateObsoleteMethod($phpcsFile, $stackPtr); + } + + /** + * Check if obsolete methods are used + * + * @param $phpcsFile + * @param $stackPtr + */ + private function validateObsoleteMethod($phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); + + foreach ($this->obsoleteMethods as $method) { + if ($tokens[$stringPos]['content'] === $method) { + $phpcsFile->addWarning( + sprintf("Contains obsolete method: %s.", $method), + $stackPtr, + self::ERROR_CODE_METHOD + ); + } + } + } +} diff --git a/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.inc b/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.inc new file mode 100644 index 00000000..70c71642 --- /dev/null +++ b/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.inc @@ -0,0 +1,36 @@ +_getReadConnection(); + +$connection = new Connection(); +return $connection->_getWriteConnection(); + +$this->getMethod( + function($param){ + $param->_getWriteAdapter(); + } +); + +$writeAdapter = $this->getWriteAdapter(); + +protected function getConnection() +{ + return $this->_resource->getReadConnection($this->connection); +} + +return $this->_getReadAdapter(); + +$this->getReadAdapterMyMehtod(); + +private function getReadAdapter() +{ + +} + +$getWriteAdapter = new WriteAdapter(); + +$getWriteAdapter = $this->getWriteAdapter(); diff --git a/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php b/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php new file mode 100644 index 00000000..cb0afe53 --- /dev/null +++ b/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php @@ -0,0 +1,36 @@ + 1, + 6 => 1, + 10 => 1, + 14 => 1, + 18 => 1, + 21 => 1, + 25 => 1, + 32 => 1 + ]; + } +} From 5a34fd1e0a4f02094e54d6767a5f46f705b002a9 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 7 Oct 2021 11:00:57 +0200 Subject: [PATCH 47/99] AC-676: Create phpcs static check for ObsoleteConnectionTest --- Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php | 8 ++++---- Magento2/ruleset.xml | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php b/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php index cb0afe53..a451d2cf 100644 --- a/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php +++ b/Magento2/Tests/Legacy/ObsoleteConnectionUnitTest.php @@ -23,14 +23,14 @@ public function getErrorList() public function getWarningList() { return [ - 3 => 1, - 6 => 1, + 7 => 1, 10 => 1, 14 => 1, 18 => 1, - 21 => 1, + 22 => 1, 25 => 1, - 32 => 1 + 29 => 1, + 36 => 1 ]; } } diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 1b1c7f1b..c9d22463 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -313,6 +313,10 @@ 8 warning + + 8 + warning + From 0bea0bc0f3017fd0b9b6af3bc8f840b7cb946cbf Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 7 Oct 2021 11:06:29 +0200 Subject: [PATCH 48/99] AC-676: Create phpcs static check for ObsoleteConnectionTest --- Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php index ac48af93..63949a38 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php @@ -15,7 +15,7 @@ class ObsoleteConnectionSniff implements Sniff private const ERROR_CODE_METHOD = 'FoundObsoleteMethod'; /** - * @var string[] + * @var string[] */ private $obsoleteMethods = [ '_getReadConnection', @@ -49,11 +49,11 @@ public function process(File $phpcsFile, $stackPtr) /** * Check if obsolete methods are used - * - * @param $phpcsFile - * @param $stackPtr + * + * @param File $phpcsFile + * @param int $stackPtr */ - private function validateObsoleteMethod($phpcsFile, $stackPtr) + private function validateObsoleteMethod(File $phpcsFile, int $stackPtr) { $tokens = $phpcsFile->getTokens(); $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); From 5f08bf5316cd2d048cac6cc20cbb8327f408f2ea Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Mon, 11 Oct 2021 15:01:46 +0200 Subject: [PATCH 49/99] AC-678: Create phpcs sniff for ObsoleteResponseTest --- .../Sniffs/Legacy/ObsoleteResponseSniff.php | 62 +++++++++++++++++++ .../Tests/Legacy/ObsoleteResponseUnitTest.inc | 39 ++++++++++++ .../Tests/Legacy/ObsoleteResponseUnitTest.php | 40 ++++++++++++ Magento2/ruleset.xml | 4 ++ 4 files changed, 145 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php create mode 100644 Magento2/Tests/Legacy/ObsoleteResponseUnitTest.inc create mode 100644 Magento2/Tests/Legacy/ObsoleteResponseUnitTest.php diff --git a/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php new file mode 100644 index 00000000..affb5771 --- /dev/null +++ b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php @@ -0,0 +1,62 @@ +getTokens(); + $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); + + foreach ($this->obsoleteResponseMethods as $method) { + if ($tokens[$stringPos]['content'] === $method) { + $phpcsFile->addWarning( + sprintf('Contains obsolete response method: %s.', $method), + $stackPtr, + self::WARNING_CODE_METHOD + ); + } + } + } +} diff --git a/Magento2/Tests/Legacy/ObsoleteResponseUnitTest.inc b/Magento2/Tests/Legacy/ObsoleteResponseUnitTest.inc new file mode 100644 index 00000000..4e33d0f7 --- /dev/null +++ b/Magento2/Tests/Legacy/ObsoleteResponseUnitTest.inc @@ -0,0 +1,39 @@ +_view->loadLayout(['default', 'test'], true, true, false); +$this->_view->renderLayout(); + +protected function _addBreadcrumb($label, $title = null, $link = null) +{ + $this->getLayout()->getBlock('test')->addLink($label, $title, $link); +} + +$this->editPost = $objectManagerHelper->getObject( + TestClass::class, + [ + '_redirect' => $this->redirect, + ] +); + +$this->_redirect('test/path'); + +$this->_forward('grid'); + +$this->_initAction()->_setActiveMenu( + 'Magento_Invitation::report_magento_invitation_order' +)->_addBreadcrumb( + __('Invitation Report by Customers'), + __('Invitation Report by Order Conversion Rate') +)->_addLeft( +)->_addJs( + $this->_view->getLayout()->createBlock(TestBlock::class)->setTemplate('Test::test.phtml') +); + +private function _addContent(AbstractBlock $block) +{ + return $this->_moveBlockToContainer($block, 'content'); +} diff --git a/Magento2/Tests/Legacy/ObsoleteResponseUnitTest.php b/Magento2/Tests/Legacy/ObsoleteResponseUnitTest.php new file mode 100644 index 00000000..b35d43a1 --- /dev/null +++ b/Magento2/Tests/Legacy/ObsoleteResponseUnitTest.php @@ -0,0 +1,40 @@ + 1, + 8 => 1, + 10 => 1, + 22 => 1, + 24 => 1, + 26 => 1, + 28 => 1, + 31 => 1, + 32 => 1, + 36 => 1, + 38 => 1 + ]; + } +} diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 1b1c7f1b..f2be02f2 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -313,6 +313,10 @@ 8 warning + + 8 + warning + From 53380c7613790d92b88c1ff5a04961c340df3e33 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Mon, 11 Oct 2021 16:18:57 +0200 Subject: [PATCH 50/99] AC-1314: Fix copyright sniff --- ...est.xml => CopyrightAnotherExtensionsFilesUnitTest.3.xml} | 0 .../Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php | 5 +++++ 2 files changed, 5 insertions(+) rename Magento2/Tests/Legacy/{CopyrightAnotherExtensionsFilesUnitTest.xml => CopyrightAnotherExtensionsFilesUnitTest.3.xml} (100%) diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.xml b/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.3.xml similarity index 100% rename from Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.xml rename to Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.3.xml diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php b/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php index 8796abb9..4223e600 100644 --- a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php +++ b/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php @@ -36,6 +36,11 @@ public function getWarningList($testFile = '') if ($testFile === 'CopyrightAnotherExtensionsFilesUnitTest.4.js') { return []; } + if ($testFile === 'CopyrightAnotherExtensionsFilesUnitTest.5.less') { + return [ + null => 1, + ]; + } return []; } } From 9416fc8d6b91d4bf3a034df96fbf58e936e14dba Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Wed, 13 Oct 2021 10:50:51 +0200 Subject: [PATCH 51/99] AC-1314: Fix copyright sniff --- .../Legacy/CopyrightAnotherExtensionsFilesUnitTest.5.less | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.5.less diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.5.less b/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.5.less new file mode 100644 index 00000000..a86154e6 --- /dev/null +++ b/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.5.less @@ -0,0 +1,8 @@ +/** + * Copyright © Magento, Inc. + * See COPYING.txt for license details. + */ + +//@magento_import "magento_import.less"; +@import "dir/import.less"; + From 9286ff9d0105ceec1074d473db0ffbe0d4ecf674 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Wed, 13 Oct 2021 10:57:10 +0200 Subject: [PATCH 52/99] AC-678: Create phpcs sniff for ObsoleteResponseTest --- .../Sniffs/Legacy/ObsoleteResponseSniff.php | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php index affb5771..725a8b15 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php @@ -18,16 +18,16 @@ class ObsoleteResponseSniff implements Sniff * @var string[] */ private $obsoleteResponseMethods = [ - 'loadLayout', - 'renderLayout', - '_redirect', - '_forward', - '_setActiveMenu', - '_addBreadcrumb', - '_addContent', - '_addLeft', - '_addJs', - '_moveBlockToContainer', + 'loadLayout' => 'Please use \Magento\Framework\View\Layout\Builder::build instead.', + 'renderLayout' => 'Please use \Magento\Framework\Controller\ResultInterface::renderResult instead.', + '_redirect' => 'Please use \Magento\Backend\Model\View\Result\Redirect::render instead.', + '_forward' => 'Please use \Magento\Backend\Model\View\Result\Forward::forward instead.', + '_setActiveMenu' => 'Please use \Magento\Backend\Model\View\Result\Page::setActiveMenu instead.', + '_addBreadcrumb' => 'Please use \Magento\Backend\Model\View\Result\Page::addBreadcrumb instead.', + '_addContent' => 'Please use \Magento\Backend\Model\View\Result\Page::addContent instead.', + '_addLeft' => 'Please use \Magento\Backend\Model\View\Result\Page::addLeft instead.', + '_addJs' => 'Please use \Magento\Backend\Model\View\Result\Page::addJs instead.', + '_moveBlockToContainer' => 'Please use \Magento\Backend\Model\View\Result\Page::moveBlockToContainer instead.', ]; /** @@ -49,10 +49,10 @@ public function process(File $phpcsFile, $stackPtr) $tokens = $phpcsFile->getTokens(); $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); - foreach ($this->obsoleteResponseMethods as $method) { + foreach ($this->obsoleteResponseMethods as $method => $errorMessage) { if ($tokens[$stringPos]['content'] === $method) { $phpcsFile->addWarning( - sprintf('Contains obsolete response method: %s.', $method), + sprintf('%s method is deprecated. %s', $method, $errorMessage), $stackPtr, self::WARNING_CODE_METHOD ); From ec36aef508e2910f8d4866e932fc7cea98ccf8ae Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Wed, 13 Oct 2021 11:51:00 +0200 Subject: [PATCH 53/99] AC-676: Create phpcs static check for ObsoleteConnectionTest --- Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php index 63949a38..a1425cab 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php @@ -61,7 +61,7 @@ private function validateObsoleteMethod(File $phpcsFile, int $stackPtr) foreach ($this->obsoleteMethods as $method) { if ($tokens[$stringPos]['content'] === $method) { $phpcsFile->addWarning( - sprintf("Contains obsolete method: %s.", $method), + sprintf("Contains obsolete method: %s. Please use getConnection method instead.", $method), $stackPtr, self::ERROR_CODE_METHOD ); From e59ca3ff35c0f35afe0ae2e37465f482f1bc454c Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 13 Oct 2021 12:05:43 +0200 Subject: [PATCH 54/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Sniffs/Legacy/LayoutSniff.php | 56 +++++----------------- Magento2/Tests/Legacy/LayoutUnitTest.1.xml | 6 +-- Magento2/Tests/Legacy/LayoutUnitTest.php | 14 +++--- 3 files changed, 22 insertions(+), 54 deletions(-) diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index 8731c03a..2575e2b5 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -3,6 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types = 1); namespace Magento2\Sniffs\Legacy; @@ -20,7 +21,6 @@ class LayoutSniff implements Sniff private const ERROR_CODE_NOT_ALLOWED = 'NotAllowed'; private const ERROR_CODE_OBSOLETE = 'Obsolete'; private const ERROR_CODE_OBSOLETE_CLASS = 'ObsoleteClass'; - private const ERROR_CODE_ATTRIBUTE_NOT_VALID = 'AttributeNotValid'; private const ERROR_CODE_METHOD_NOT_ALLOWED = 'MethodNotAllowed'; private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_NOT_ALLOWED = 'CharacterNotAllowedInAttribute'; private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_EXPECTED = 'CharacterExpectedInAttribute'; @@ -229,7 +229,6 @@ public function process(File $phpcsFile, $stackPtr) } $this->testObsoleteReferences($layout, $phpcsFile); - $this->testObsoleteAttributes($layout, $phpcsFile); $this->testHeadBlocks($layout, $phpcsFile); $this->testOutputAttribute($layout, $phpcsFile); $this->testHelperAttribute($layout, $phpcsFile); @@ -240,21 +239,21 @@ public function process(File $phpcsFile, $stackPtr) /** * Check for obsolete block references * - * @todo missing test * @param SimpleXMLElement $layout * @param File $phpcsFile */ private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile): void { foreach ($layout as $handle) { - if (!isset($this->obsoleteReferences[$handle->getName()])) { + $attributes = $handle->attributes(); + if (!isset($this->obsoleteReferences[(string)$attributes->handle])) { continue; } - foreach ($handle->xpath('reference') as $reference) { - if (strpos((string)$reference['name'], $this->obsoleteReferences[$handle->getName()]) !== false) { + foreach ($handle->xpath('//reference | //referenceContainer | //referenceBlock') as $reference) { + if (in_array((string)$reference['name'], $this->obsoleteReferences[(string)$attributes->handle]) !== false) { $phpcsFile->addError( 'The block being referenced is removed.', - dom_import_simplexml($reference)->getLineNo(), + dom_import_simplexml($reference)->getLineNo()-1, self::ERROR_CODE_OBSOLETE ); } @@ -317,45 +316,12 @@ private function testOutputAttribute(SimpleXMLElement $layout, File $phpcsFile): if (!empty($elements)) { $phpcsFile->addError( 'output="toHtml" is obsolete. Use output="1"', - dom_import_simplexml($elements[0])->getLineNo(), + dom_import_simplexml($elements[0])->getLineNo()-1, self::ERROR_CODE_OBSOLETE ); }; } - /** - * Tests the attributes of the top-level Layout Node. Verifies there are no longer attributes of "parent" or "owner" - * - * @todo missing test - * @param SimpleXMLElement $layout - * @param File $phpcsFile - */ - private function testObsoleteAttributes(SimpleXMLElement $layout, File $phpcsFile): void - { - $type = $layout['type']; - $parent = $layout['parent']; - $owner = $layout['owner']; - - if ((string)$type === 'page') { - if ($parent) { - $phpcsFile->addError( - 'Attribute "parent" is not valid', - dom_import_simplexml($parent)->getLineNo(), - self::ERROR_CODE_ATTRIBUTE_NOT_VALID - ); - } - } - if ((string)$type === 'fragment') { - if ($owner) { - $phpcsFile->addError( - 'Attribute "owner" is not valid', - dom_import_simplexml($owner)->getLineNo(), - self::ERROR_CODE_ATTRIBUTE_NOT_VALID - ); - } - } - } - /** * Returns attribute value by attribute name * @@ -381,14 +347,14 @@ private function testHelperAttribute(SimpleXMLElement $layout, File $phpcsFile): if (strpos($this->getAttribute($action, 'helper'), '/') !== false) { $phpcsFile->addError( "'helper' attribute contains '/'", - dom_import_simplexml($action)->getLineNo(), + dom_import_simplexml($action)->getLineNo()-1, self::ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_NOT_ALLOWED ); } if (strpos($this->getAttribute($action, 'helper'), '::') === false) { $phpcsFile->addError( "'helper' attribute does not contain '::'", - dom_import_simplexml($action)->getLineNo(), + dom_import_simplexml($action)->getLineNo()-1, self::ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_EXPECTED ); } @@ -408,7 +374,7 @@ private function testListText(SimpleXMLElement $layout, File $phpcsFile): void $phpcsFile->addError( 'The class \Magento\Framework\View\Element\Text\ListText' . ' is not supposed to be used in layout anymore.', - dom_import_simplexml($elements[0])->getLineNo(), + dom_import_simplexml($elements[0])->getLineNo()-1, self::ERROR_CODE_OBSOLETE_CLASS ); }; @@ -430,7 +396,7 @@ private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile 'Call of method "%s" via layout instruction is not allowed.', $attributes['method'] ), - dom_import_simplexml($node)->getLineNo(), + dom_import_simplexml($node)->getLineNo()-1, self::ERROR_CODE_METHOD_NOT_ALLOWED ); } diff --git a/Magento2/Tests/Legacy/LayoutUnitTest.1.xml b/Magento2/Tests/Legacy/LayoutUnitTest.1.xml index f051284a..591b51ae 100644 --- a/Magento2/Tests/Legacy/LayoutUnitTest.1.xml +++ b/Magento2/Tests/Legacy/LayoutUnitTest.1.xml @@ -6,11 +6,11 @@ */ --> - + - + @@ -19,7 +19,7 @@ - + diff --git a/Magento2/Tests/Legacy/LayoutUnitTest.php b/Magento2/Tests/Legacy/LayoutUnitTest.php index c86ddee0..8e7a6551 100644 --- a/Magento2/Tests/Legacy/LayoutUnitTest.php +++ b/Magento2/Tests/Legacy/LayoutUnitTest.php @@ -16,21 +16,23 @@ public function getErrorList($testFile = '') { if ($testFile === 'LayoutUnitTest.1.xml') { return [ + 13 => 1, + 22 => 1, 23 => 1, - 146 => 1, - 149 => 1, + 145 => 1, + 148 => 1, ]; } if ($testFile === 'LayoutUnitTest.2.xml') { return [ - 12 => 1, - 29 => 1, + 11 => 1, + 28 => 1, ]; } if ($testFile === 'LayoutUnitTest.3.xml') { return [ - 16 => 1, - 19 => 1, + 15 => 1, + 18 => 1, ]; } return []; From c30669f41d71e87f9c9d0c3f2b20f3ff84de8e3f Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 13 Oct 2021 12:14:55 +0200 Subject: [PATCH 55/99] AC-670: Create phpcs static check for LayoutTest --- Magento2/Sniffs/Legacy/LayoutSniff.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index 2575e2b5..72cc6345 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -245,12 +245,12 @@ public function process(File $phpcsFile, $stackPtr) private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile): void { foreach ($layout as $handle) { - $attributes = $handle->attributes(); - if (!isset($this->obsoleteReferences[(string)$attributes->handle])) { + $handleAttribute = (string)$handle->attributes()->handle; + if (!isset($this->obsoleteReferences[$handleAttribute])) { continue; } foreach ($handle->xpath('//reference | //referenceContainer | //referenceBlock') as $reference) { - if (in_array((string)$reference['name'], $this->obsoleteReferences[(string)$attributes->handle]) !== false) { + if (in_array((string)$reference['name'], $this->obsoleteReferences[$handleAttribute]) !== false) { $phpcsFile->addError( 'The block being referenced is removed.', dom_import_simplexml($reference)->getLineNo()-1, From 36776b8f788c629bb73afa88e22b3ddb3d2aa5d7 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 13 Oct 2021 12:46:43 +0200 Subject: [PATCH 56/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...assReferencesInConfigurationFilesSniff.php | 60 ++----------------- 1 file changed, 4 insertions(+), 56 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index 9bbd9f07..e0187223 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -3,6 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types = 1); namespace Magento2\Sniffs\Legacy; @@ -60,9 +61,6 @@ public function process(File $phpcsFile, $stackPtr) $layouts = $this->collectClassesInLayout($xml); $this->assertNonFactoryName($phpcsFile, $layouts); - - $layoutTabs = $this->collectClassesInLayoutTabs($xml); - $this->assertNonFactoryNameTab($phpcsFile, $layoutTabs); } /** @@ -106,25 +104,6 @@ private function assertNonFactoryNameModule(File $phpcsFile, array $classes) } } - /** - * Check whether specified class names in layout tabs are right according PSR-1 Standard. - * - * @param File $phpcsFile - * @param array $elements - */ - private function assertNonFactoryNameTab(File $phpcsFile, array $elements) - { - foreach ($elements as $element) { - if (preg_match('/\//', $element['value']) !== false) { - $phpcsFile->addError( - self::ERROR_MESSAGE_CONFIG, - $element['lineNumber'], - self::ERROR_CODE_CONFIG, - ); - } - } - } - /** * Format the incoming XML to avoid tags split into several lines. * @@ -198,41 +177,10 @@ function (array $extendedNode) { */ private function collectClassesInLayout(SimpleXMLElement $xml): array { - $classes = $this->getValuesFromXmlTagAttribute( - $xml, - '/layout//@helper', - 'helper' - ); - $classes = array_map( - function (array $extendedNode) { - $extendedNode['value'] = explode('::', trim($extendedNode['value']))[0]; - return $extendedNode; - }, - $classes - ); - $classes = array_merge( - $classes, - $this->getValuesFromXmlTagAttribute( - $xml, - '/layout//@module', - 'module' - ) - ); - - return $classes; - } - - /** - * Extract class references from layout tabs - * - * @param SimpleXMLElement $xml - * @return array - */ - private function collectClassesInLayoutTabs(SimpleXMLElement $xml): array - { - return $this->getValuesFromXmlTagContent( + return $this->getValuesFromXmlTagAttribute( $xml, - '/layout//action[@method="addTab"]/block', + '/layout//@module', + 'module' ); } From a78b21dbdff8873078a44cb16859bc3cbaa16ab6 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 13 Oct 2021 14:58:41 +0200 Subject: [PATCH 57/99] Update Magento2/Sniffs/Legacy/LayoutSniff.php Co-authored-by: Sergii Ivashchenko --- Magento2/Sniffs/Legacy/LayoutSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index 72cc6345..3a2c2044 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -271,7 +271,7 @@ private function getFormattedXML(File $phpcsFile) { $doc = new DomDocument('1.0'); $doc->formatOutput = true; - $doc->loadXML($phpcsFile->getTokensAsString(0, 999999)); + $doc->loadXML($phpcsFile->getTokensAsString(0, count($phpcsFile->getTokens()))); return $doc->saveXML(); } From 39267bad4f6ac3349585a0b2b81e94a3ada2f11c Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 13 Oct 2021 15:03:42 +0200 Subject: [PATCH 58/99] Update Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php Co-authored-by: Sergii Ivashchenko --- .../Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index e0187223..f612c7bc 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -114,7 +114,7 @@ private function getFormattedXML(File $phpcsFile) { $doc = new DomDocument('1.0'); $doc->formatOutput = true; - $doc->loadXML($phpcsFile->getTokensAsString(0, 999999)); + $doc->loadXML($phpcsFile->getTokensAsString(0, count($phpcsFile->getTokens()))); return $doc->saveXML(); } From 8402f7d0888c536d186bd5bc2b6548b30db141d9 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 13 Oct 2021 17:16:42 +0200 Subject: [PATCH 59/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...lassReferencesInConfigurationFilesSniff.php | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index e0187223..1e06d1d8 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -58,9 +58,6 @@ public function process(File $phpcsFile, $stackPtr) $modules = $this->getValuesFromXmlTagAttribute($xml, '//@module', 'module'); $this->assertNonFactoryNameModule($phpcsFile, $modules); - - $layouts = $this->collectClassesInLayout($xml); - $this->assertNonFactoryName($phpcsFile, $layouts); } /** @@ -169,21 +166,6 @@ function (array $extendedNode) { return $classes; } - /** - * Parse an XML for references to PHP class names in selected tags or attributes - * - * @param SimpleXMLElement $xml - * @return array - */ - private function collectClassesInLayout(SimpleXMLElement $xml): array - { - return $this->getValuesFromXmlTagAttribute( - $xml, - '/layout//@module', - 'module' - ); - } - /** * Extract value from tag contents which exist in the XML path * From ee4c7d6363ba28191e4089b520b26e88e5886333 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Wed, 13 Oct 2021 17:31:47 +0200 Subject: [PATCH 60/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- ...ferencesInConfigurationFilesUnitTest.5.xml | 116 ------------------ 1 file changed, 116 deletions(-) delete mode 100644 Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml diff --git a/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml b/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml deleted file mode 100644 index 142ef2d1..00000000 --- a/Magento2/Tests/Legacy/ClassReferencesInConfigurationFilesUnitTest.5.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Product - Item Status - Original Price - Price - Qty - Subtotal - Tax Amount - Tax Percent - Discount Amount - Row Total - - - - - - col-product - col-status - col-price-original - col-price - col-ordered-qty - col-subtotal - col-tax-amount - col-tax-percent - col-discont - col-total - - - - - - - - - - - - - - - - - - - - order_info - order_tab_info - - - - order_invoices - sales_order_invoice.grid.container - - - - - - - order_shipments - sales_order_shipment.grid.container - - - order_history - Magento\Sales\Block\Adminhtml\Order\View\Tab\History - - - - order_transactions - sales_transactions.grid.container - - - - - - - - - - - - - - - - - From 7fdd6b44b43c44a5a60272b531c39e9ebc8c2835 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 14 Oct 2021 11:17:31 +0200 Subject: [PATCH 61/99] AC-672: Create phpcs static check for LicenseTest --- Magento2/Sniffs/Legacy/LicenseSniff.php | 71 ++++++++++++++++++++ Magento2/Tests/Legacy/LicenseUnitTest.1.inc | 5 ++ Magento2/Tests/Legacy/LicenseUnitTest.2.inc | 5 ++ Magento2/Tests/Legacy/LicenseUnitTest.3.xml | 10 +++ Magento2/Tests/Legacy/LicenseUnitTest.4.xml | 10 +++ Magento2/Tests/Legacy/LicenseUnitTest.5.less | 4 ++ Magento2/Tests/Legacy/LicenseUnitTest.php | 49 ++++++++++++++ Magento2/ruleset.xml | 4 ++ 8 files changed, 158 insertions(+) create mode 100644 Magento2/Sniffs/Legacy/LicenseSniff.php create mode 100644 Magento2/Tests/Legacy/LicenseUnitTest.1.inc create mode 100644 Magento2/Tests/Legacy/LicenseUnitTest.2.inc create mode 100644 Magento2/Tests/Legacy/LicenseUnitTest.3.xml create mode 100644 Magento2/Tests/Legacy/LicenseUnitTest.4.xml create mode 100644 Magento2/Tests/Legacy/LicenseUnitTest.5.less create mode 100644 Magento2/Tests/Legacy/LicenseUnitTest.php diff --git a/Magento2/Sniffs/Legacy/LicenseSniff.php b/Magento2/Sniffs/Legacy/LicenseSniff.php new file mode 100644 index 00000000..6a59ccc8 --- /dev/null +++ b/Magento2/Sniffs/Legacy/LicenseSniff.php @@ -0,0 +1,71 @@ +getTokens(); + $content = null; + + if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_STRING) { + $content = $tokens[$stackPtr]['content']; + } + if ($tokens[$stackPtr]['code'] === T_INLINE_HTML) { + $content = $phpcsFile->getTokensAsString($stackPtr, 1); + } + if ($content != null){ + $this->checkLicense($content, $stackPtr, $phpcsFile); + } + } + + /** + * @param string $content + * @param int $stackPtr + * @param File $phpcsFile + */ + private function checkLicense(string $content, int $stackPtr, File $phpcsFile): void + { + $commentContent = $content; + if (stripos($commentContent, 'copyright') === false) { + return; + } + foreach (['Irubin Consulting Inc', 'DBA Varien', 'Magento Inc'] as $legacyText) { + if (stripos($commentContent, $legacyText) !== false) { + $phpcsFile->addWarning( + sprintf("The copyright license contains legacy text: %s.", $legacyText), + $stackPtr, + self::WARNING_CODE + ); + } + } + } +} diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.1.inc b/Magento2/Tests/Legacy/LicenseUnitTest.1.inc new file mode 100644 index 00000000..75f04eae --- /dev/null +++ b/Magento2/Tests/Legacy/LicenseUnitTest.1.inc @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.4.xml b/Magento2/Tests/Legacy/LicenseUnitTest.4.xml new file mode 100644 index 00000000..73c7558c --- /dev/null +++ b/Magento2/Tests/Legacy/LicenseUnitTest.4.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.5.less b/Magento2/Tests/Legacy/LicenseUnitTest.5.less new file mode 100644 index 00000000..8134b704 --- /dev/null +++ b/Magento2/Tests/Legacy/LicenseUnitTest.5.less @@ -0,0 +1,4 @@ +/** + * @copyright Copyright Irubin Consulting Inc + * See COPYING.txt for license details. + */ \ No newline at end of file diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.php b/Magento2/Tests/Legacy/LicenseUnitTest.php new file mode 100644 index 00000000..edcca88e --- /dev/null +++ b/Magento2/Tests/Legacy/LicenseUnitTest.php @@ -0,0 +1,49 @@ + 1, + ]; + } + + if ($testFile === 'LicenseUnitTest.4.xml') { + return [ + 4 => 1, + ]; + } + + if ($testFile === 'LicenseUnitTest.5.less') { + return [ + 2 => 1, + ]; + } + + return []; + } +} diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 5966203f..4de85194 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -194,6 +194,10 @@ warning *\.xml$ + + 9 + warning + From e3cdba0476f26aaa1b4945d8dda8b501bb800abb Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 14 Oct 2021 11:19:40 +0200 Subject: [PATCH 62/99] AC-672: Create phpcs static check for LicenseTest --- Magento2/Tests/Legacy/LicenseUnitTest.3.xml | 2 +- Magento2/Tests/Legacy/LicenseUnitTest.4.xml | 2 +- Magento2/Tests/Legacy/LicenseUnitTest.5.less | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.3.xml b/Magento2/Tests/Legacy/LicenseUnitTest.3.xml index a60baf13..cf29cd23 100644 --- a/Magento2/Tests/Legacy/LicenseUnitTest.3.xml +++ b/Magento2/Tests/Legacy/LicenseUnitTest.3.xml @@ -7,4 +7,4 @@ --> - \ No newline at end of file + diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.4.xml b/Magento2/Tests/Legacy/LicenseUnitTest.4.xml index 73c7558c..c8e81d11 100644 --- a/Magento2/Tests/Legacy/LicenseUnitTest.4.xml +++ b/Magento2/Tests/Legacy/LicenseUnitTest.4.xml @@ -7,4 +7,4 @@ --> - \ No newline at end of file + diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.5.less b/Magento2/Tests/Legacy/LicenseUnitTest.5.less index 8134b704..1b21386f 100644 --- a/Magento2/Tests/Legacy/LicenseUnitTest.5.less +++ b/Magento2/Tests/Legacy/LicenseUnitTest.5.less @@ -1,4 +1,4 @@ /** * @copyright Copyright Irubin Consulting Inc * See COPYING.txt for license details. - */ \ No newline at end of file + */ From c22fd18265cb1fedbac7125de21bd9671cc01e93 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 14 Oct 2021 11:25:44 +0200 Subject: [PATCH 63/99] AC-672: Create phpcs static check for LicenseTest --- Magento2/Sniffs/Legacy/LicenseSniff.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Magento2/Sniffs/Legacy/LicenseSniff.php b/Magento2/Sniffs/Legacy/LicenseSniff.php index 6a59ccc8..be1eb173 100644 --- a/Magento2/Sniffs/Legacy/LicenseSniff.php +++ b/Magento2/Sniffs/Legacy/LicenseSniff.php @@ -13,9 +13,14 @@ class LicenseSniff implements Sniff { - private const WARNING_CODE = 'FoundLegacyTextInCopyright'; - + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ public $supportedTokenizers = [TokenizerSymbolsInterface::TOKENIZER_CSS, 'PHP']; + + private const WARNING_CODE = 'FoundLegacyTextInCopyright'; /** * @inheritdoc @@ -42,12 +47,14 @@ public function process(File $phpcsFile, $stackPtr) if ($tokens[$stackPtr]['code'] === T_INLINE_HTML) { $content = $phpcsFile->getTokensAsString($stackPtr, 1); } - if ($content != null){ - $this->checkLicense($content, $stackPtr, $phpcsFile); + if ($content != null) { + $this->checkLicense($content, $stackPtr, $phpcsFile); } } /** + * Check that the copyright license does not contain legacy text + * * @param string $content * @param int $stackPtr * @param File $phpcsFile From 0d1ae00205bdf433dce0959ebbf777485a9912c8 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 14 Oct 2021 11:27:27 +0200 Subject: [PATCH 64/99] AC-672: Create phpcs static check for LicenseTest --- Magento2/Sniffs/Legacy/LicenseSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/LicenseSniff.php b/Magento2/Sniffs/Legacy/LicenseSniff.php index be1eb173..020c0a48 100644 --- a/Magento2/Sniffs/Legacy/LicenseSniff.php +++ b/Magento2/Sniffs/Legacy/LicenseSniff.php @@ -54,7 +54,7 @@ public function process(File $phpcsFile, $stackPtr) /** * Check that the copyright license does not contain legacy text - * + * * @param string $content * @param int $stackPtr * @param File $phpcsFile From 08ed34bee413e4dff87c40224be18dc0d1ad323b Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 14 Oct 2021 12:49:33 +0200 Subject: [PATCH 65/99] Update Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jorge Cuerdo Álvarez --- .../ClassReferencesInConfigurationFilesSniff.php | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index b82228d7..ca1474f3 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -131,24 +131,18 @@ private function collectClassesInConfig(SimpleXMLElement $xml): array | //model_token | //writer_model | //clone_model | //frontend_model | //working_model | //admin_renderer | //renderer', ); - $classes = array_merge( +$classes = array_merge( $classes, $this->getValuesFromXmlTagAttribute( $xml, '//@backend_model', 'backend_model' - ) - ); - $classes = array_merge( - $classes, - $this->getValuesFromXmlTagAttribute( + ), +$this->getValuesFromXmlTagAttribute( $xml, '/config//preference', 'type' - ) - ); - $classes = array_merge( - $classes, + ), $this->getValuesFromXmlTagName( $xml, '/logging/*/expected_models/* | /logging/*/actions/*/expected_models/*', From c9ca788bbbdeac6598752d23e84e02a3857eebd0 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 14 Oct 2021 12:53:42 +0200 Subject: [PATCH 66/99] AC-663: Create phpcs static check for ClassesTest::testPhpCode --- .../Legacy/ClassReferencesInConfigurationFilesSniff.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php index ca1474f3..f2b5b400 100644 --- a/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php +++ b/Magento2/Sniffs/Legacy/ClassReferencesInConfigurationFilesSniff.php @@ -131,14 +131,15 @@ private function collectClassesInConfig(SimpleXMLElement $xml): array | //model_token | //writer_model | //clone_model | //frontend_model | //working_model | //admin_renderer | //renderer', ); -$classes = array_merge( + + $classes = array_merge( $classes, $this->getValuesFromXmlTagAttribute( $xml, '//@backend_model', 'backend_model' ), -$this->getValuesFromXmlTagAttribute( + $this->getValuesFromXmlTagAttribute( $xml, '/config//preference', 'type' From 6691ae8ed651a14b2af02a16ce0d385e53af1573 Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 14 Oct 2021 14:31:05 +0200 Subject: [PATCH 67/99] AC-672: Create phpcs static check for LicenseTest --- Magento2/ruleset.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 0f6c788c..ffe71710 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -202,10 +202,6 @@ warning *\.xml$ - - 9 - warning - @@ -338,6 +334,10 @@ 8 warning + + 8 + warning + From c38ca663482bb17cae91e66b78f0ac544fe3e65d Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 14 Oct 2021 15:25:33 +0200 Subject: [PATCH 68/99] AC-206: Create UCT phpcs ruleset for customizations only --- Magento2/customizations-ruleset.xml | 719 ++++++++++++++++++++++++++++ 1 file changed, 719 insertions(+) create mode 100644 Magento2/customizations-ruleset.xml diff --git a/Magento2/customizations-ruleset.xml b/Magento2/customizations-ruleset.xml new file mode 100644 index 00000000..2c7c695c --- /dev/null +++ b/Magento2/customizations-ruleset.xml @@ -0,0 +1,719 @@ + + + Magento Coding Standard + + + + + + + 10 + error + + + 10 + error + *\.phtml$ + *\.xml$ + + + 10 + error + *\.xml$ + + + 10 + error + */lib/* + *\.xml$ + + + 10 + error + *\.xml$ + + + 10 + error + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + + + 10 + error + + + 10 + error + + + 10 + error + *\.xml$ + + + 10 + error + *\.xml$ + + + 10 + error + *\.xml$ + + + 10 + error + */_files/* + */Fixtures/* + */lib/* + */Test/* + *Test.php + */tests/* + + + 10 + error + + + 10 + error + + + *\.phtml$ + + + 10 + error + */_files/* + */Fixtures/* + */lib/* + */Test/* + *Test.php + */tests/* + + + 10 + error + + + 10 + error + + + 10 + error + *\.phtml$ + + + 10 + error + *\.xml$ + + + 10 + error + + + 10 + error + + + etc/config.xml + etc/config.*.xml + etc/*/config.xml + 10 + error + + + 10 + error + + + *\.php$ + 10 + error + + + 10 + error + *\.xml$ + + + 10 + error + */view/(adminhtml|frontend|base)/*\/.xml + + + 10 + error + *\.xml$ + *\.js$ + + + *\/etc/*.xml$ + *\/etc/wsdl.xml$ + *\/etc/wsdl2.xml$ + *\/etc/wsi.xml$ + 10 + error + + + + 9 + warning + + + 9 + warning + */_files/* + */Fixtures/* + */lib/* + */Test/* + *Test.php + */tests/* + + + *\.phtml$ + 9 + warning + + + 9 + warning + */_files/* + */Fixtures/* + */lib/* + */Test/* + *Test.php + */tests/* + + + 9 + warning + *\.xml$ + + + *\/.phtml$ + 9 + warning + *\.xml$ + + + + + 8 + warning + + + 8 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + + + 8 + warning + + + 8 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + + + 8 + warning + */_files/* + */Fixtures/* + */lib/* + */Test/* + *Test.php + */tests/* + + + 8 + warning + */_files/* + */Fixtures/* + */lib/* + */Setup/* + */Test/* + *Test.php + */tests/* + + + 8 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + + + 8 + warning + + + 8 + warning + *\.xml$ + + + *\.phtml$ + 8 + warning + + + 8 + warning + + + 8 + warning + + + *\/module.xml$ + 8 + warning + + + *\/di.xml$ + 8 + warning + + + 8 + warning + *\.xml$ + + + *\/widget.xml$ + 8 + warning + + + etc/config.xml + etc/config.*.xml + etc/*/config.xml + 8 + warning + + + etc/config.xml + etc/config.*.xml + etc/*/config.xml + 8 + warning + + + etc/adminhtml/system.xml + 8 + warning + + + *\.phtml$ + 8 + warning + + + + 7 + warning + + + 7 + warning + + + 7 + warning + + + 7 + warning + + + 7 + warning + + + 7 + warning + + + 7 + warning + + + 7 + warning + + + *\.xml$ + 7 + warning + + + 0 + + + 7 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + + + 7 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + *\.xml$ + + + 7 + warning + *\.xml$ + + + 7 + warning + + + 7 + warning + + + 7 + warning + + + 7 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + + + 7 + warning + *\.phtml$ + + + 7 + warning + + + 7 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + *\.xml$ + + + 7 + warning + + + + + 6 + warning + + + 6 + warning + + + + + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + *\.xml$ + + + 6 + warning + *\.xml$ + + + 6 + warning + + + + + + + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + + 0 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + *\.phtml$ + + + 6 + warning + */_files/* + */Fixtures/* + */Test/* + *Test.php + */tests/* + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 0 + + + 0 + + + 6 + warning + + + 6 + warning + + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + + + + *\.phtml$ + + + 6 + warning + + + 0 + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + + + + 0 + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + + + 6 + warning + *\.phtml$ + + + 6 + warning + + + + + + 6 + warning + + + 6 + warning + + + 6 + warning + *\.less$ + + + 0 + + + 0 + + + 0 + + + + + 5 + warning + + + 5 + warning + + + 5 + warning + + + 5 + warning + + + + + + 5 + warning + *\.xml$ + + + 5 + warning + */_files/* + */Test/* + *Test.php + + + 0 + + From 90983fbddf5e28c7c29cde5153dee707ffbca81e Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Thu, 14 Oct 2021 15:27:20 +0200 Subject: [PATCH 69/99] AC-206: Create UCT phpcs ruleset for customizations only --- Magento2/customizations-ruleset.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Magento2/customizations-ruleset.xml b/Magento2/customizations-ruleset.xml index 2c7c695c..e6820cc9 100644 --- a/Magento2/customizations-ruleset.xml +++ b/Magento2/customizations-ruleset.xml @@ -1,6 +1,6 @@ - - Magento Coding Standard + + Magento Coding Standard for customizations From ef49c1b776e4fc4dceb827eaeeeb34908ffc4edb Mon Sep 17 00:00:00 2001 From: Elisea Cornejo Date: Thu, 14 Oct 2021 16:20:27 +0200 Subject: [PATCH 70/99] AC-672: Create phpcs static check for LicenseTest --- Magento2/Sniffs/Legacy/LicenseSniff.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/LicenseSniff.php b/Magento2/Sniffs/Legacy/LicenseSniff.php index 020c0a48..c6f8ba8a 100644 --- a/Magento2/Sniffs/Legacy/LicenseSniff.php +++ b/Magento2/Sniffs/Legacy/LicenseSniff.php @@ -22,6 +22,8 @@ class LicenseSniff implements Sniff private const WARNING_CODE = 'FoundLegacyTextInCopyright'; + private const LEGACY_TEXTS = ['Irubin Consulting Inc', 'DBA Varien', 'Magento Inc']; + /** * @inheritdoc */ @@ -65,7 +67,7 @@ private function checkLicense(string $content, int $stackPtr, File $phpcsFile): if (stripos($commentContent, 'copyright') === false) { return; } - foreach (['Irubin Consulting Inc', 'DBA Varien', 'Magento Inc'] as $legacyText) { + foreach (self::LEGACY_TEXTS as $legacyText) { if (stripos($commentContent, $legacyText) !== false) { $phpcsFile->addWarning( sprintf("The copyright license contains legacy text: %s.", $legacyText), From 30a34f2bebe241c5c301b2a2bb6bfed94f4b4e5e Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Tue, 19 Oct 2021 12:38:16 +0100 Subject: [PATCH 71/99] AC-206: Updated and renamed the extesnions-ruleset.xml --- ...customizations-ruleset.xml => extensions-ruleset.xml} | 9 +++++++++ 1 file changed, 9 insertions(+) rename Magento2/{customizations-ruleset.xml => extensions-ruleset.xml} (99%) diff --git a/Magento2/customizations-ruleset.xml b/Magento2/extensions-ruleset.xml similarity index 99% rename from Magento2/customizations-ruleset.xml rename to Magento2/extensions-ruleset.xml index e6820cc9..c626c5ab 100644 --- a/Magento2/customizations-ruleset.xml +++ b/Magento2/extensions-ruleset.xml @@ -326,6 +326,15 @@ 8 warning + + 8 + warning + + + 8 + warning + + 7 From 655960e8144e2dfedf0d58a76e9d3dbd4ecba4c1 Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Tue, 19 Oct 2021 13:19:32 +0100 Subject: [PATCH 72/99] AC-206: Added Magento only ruleset --- Magento2/extensions-ruleset.xml | 728 ------------------------------ Magento2/magento-only-ruleset.xml | 16 + Magento2/ruleset.xml | 17 - 3 files changed, 16 insertions(+), 745 deletions(-) delete mode 100644 Magento2/extensions-ruleset.xml create mode 100644 Magento2/magento-only-ruleset.xml diff --git a/Magento2/extensions-ruleset.xml b/Magento2/extensions-ruleset.xml deleted file mode 100644 index c626c5ab..00000000 --- a/Magento2/extensions-ruleset.xml +++ /dev/null @@ -1,728 +0,0 @@ - - - Magento Coding Standard for customizations - - - - - - - 10 - error - - - 10 - error - *\.phtml$ - *\.xml$ - - - 10 - error - *\.xml$ - - - 10 - error - */lib/* - *\.xml$ - - - 10 - error - *\.xml$ - - - 10 - error - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - - - 10 - error - - - 10 - error - - - 10 - error - *\.xml$ - - - 10 - error - *\.xml$ - - - 10 - error - *\.xml$ - - - 10 - error - */_files/* - */Fixtures/* - */lib/* - */Test/* - *Test.php - */tests/* - - - 10 - error - - - 10 - error - - - *\.phtml$ - - - 10 - error - */_files/* - */Fixtures/* - */lib/* - */Test/* - *Test.php - */tests/* - - - 10 - error - - - 10 - error - - - 10 - error - *\.phtml$ - - - 10 - error - *\.xml$ - - - 10 - error - - - 10 - error - - - etc/config.xml - etc/config.*.xml - etc/*/config.xml - 10 - error - - - 10 - error - - - *\.php$ - 10 - error - - - 10 - error - *\.xml$ - - - 10 - error - */view/(adminhtml|frontend|base)/*\/.xml - - - 10 - error - *\.xml$ - *\.js$ - - - *\/etc/*.xml$ - *\/etc/wsdl.xml$ - *\/etc/wsdl2.xml$ - *\/etc/wsi.xml$ - 10 - error - - - - 9 - warning - - - 9 - warning - */_files/* - */Fixtures/* - */lib/* - */Test/* - *Test.php - */tests/* - - - *\.phtml$ - 9 - warning - - - 9 - warning - */_files/* - */Fixtures/* - */lib/* - */Test/* - *Test.php - */tests/* - - - 9 - warning - *\.xml$ - - - *\/.phtml$ - 9 - warning - *\.xml$ - - - - - 8 - warning - - - 8 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - - - 8 - warning - - - 8 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - - - 8 - warning - */_files/* - */Fixtures/* - */lib/* - */Test/* - *Test.php - */tests/* - - - 8 - warning - */_files/* - */Fixtures/* - */lib/* - */Setup/* - */Test/* - *Test.php - */tests/* - - - 8 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - - - 8 - warning - - - 8 - warning - *\.xml$ - - - *\.phtml$ - 8 - warning - - - 8 - warning - - - 8 - warning - - - *\/module.xml$ - 8 - warning - - - *\/di.xml$ - 8 - warning - - - 8 - warning - *\.xml$ - - - *\/widget.xml$ - 8 - warning - - - etc/config.xml - etc/config.*.xml - etc/*/config.xml - 8 - warning - - - etc/config.xml - etc/config.*.xml - etc/*/config.xml - 8 - warning - - - etc/adminhtml/system.xml - 8 - warning - - - *\.phtml$ - 8 - warning - - - 8 - warning - - - 8 - warning - - - - - 7 - warning - - - 7 - warning - - - 7 - warning - - - 7 - warning - - - 7 - warning - - - 7 - warning - - - 7 - warning - - - 7 - warning - - - *\.xml$ - 7 - warning - - - 0 - - - 7 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - - - 7 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - *\.xml$ - - - 7 - warning - *\.xml$ - - - 7 - warning - - - 7 - warning - - - 7 - warning - - - 7 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - - - 7 - warning - *\.phtml$ - - - 7 - warning - - - 7 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - *\.xml$ - - - 7 - warning - - - - - 6 - warning - - - 6 - warning - - - - - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - *\.xml$ - - - 6 - warning - *\.xml$ - - - 6 - warning - - - - - - - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - - 0 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - *\.phtml$ - - - 6 - warning - */_files/* - */Fixtures/* - */Test/* - *Test.php - */tests/* - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 0 - - - 0 - - - 6 - warning - - - 6 - warning - - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - - - - *\.phtml$ - - - 6 - warning - - - 0 - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - - - - 0 - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - - - 6 - warning - *\.phtml$ - - - 6 - warning - - - - - - 6 - warning - - - 6 - warning - - - 6 - warning - *\.less$ - - - 0 - - - 0 - - - 0 - - - - - 5 - warning - - - 5 - warning - - - 5 - warning - - - 5 - warning - - - - - - 5 - warning - *\.xml$ - - - 5 - warning - */_files/* - */Test/* - *Test.php - - - 0 - - diff --git a/Magento2/magento-only-ruleset.xml b/Magento2/magento-only-ruleset.xml new file mode 100644 index 00000000..6a81cd26 --- /dev/null +++ b/Magento2/magento-only-ruleset.xml @@ -0,0 +1,16 @@ + + + Magento Coding Standard sniffs applicable for Magento Open Source development only + + 5 + warning + *\.php$ + *\.phtml$ + + + 5 + warning + *\.php$ + *\.phtml$ + + diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index ffe71710..1b55a9ad 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -726,24 +726,7 @@ */Test/* *Test.php - - 5 - warning - *\.php$ - *\.phtml$ - - - 5 - warning - *\.php$ - *\.phtml$ - 0 - - - - - From c0d26b8dc249ba5b8e7820e8c77743e6bff4f32f Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Tue, 19 Oct 2021 13:25:04 +0100 Subject: [PATCH 73/99] AC-206: Moved License sniff to magento-only-ruleset --- Magento2/magento-only-ruleset.xml | 8 ++++++-- Magento2/ruleset.xml | 4 ---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Magento2/magento-only-ruleset.xml b/Magento2/magento-only-ruleset.xml index 6a81cd26..fbbe1ba5 100644 --- a/Magento2/magento-only-ruleset.xml +++ b/Magento2/magento-only-ruleset.xml @@ -1,13 +1,17 @@ Magento Coding Standard sniffs applicable for Magento Open Source development only - + + 5 + warning + + 5 warning *\.php$ *\.phtml$ - + 5 warning *\.php$ diff --git a/Magento2/ruleset.xml b/Magento2/ruleset.xml index 1b55a9ad..442d9867 100644 --- a/Magento2/ruleset.xml +++ b/Magento2/ruleset.xml @@ -334,10 +334,6 @@ 8 warning - - 8 - warning - From c7250a26de1b7a54bc7880338c08564146e96d36 Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Tue, 19 Oct 2021 13:36:17 +0100 Subject: [PATCH 74/99] AC-206: Corrected rules names in magento-only-ruleset --- Magento2/magento-only-ruleset.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Magento2/magento-only-ruleset.xml b/Magento2/magento-only-ruleset.xml index fbbe1ba5..bace947f 100644 --- a/Magento2/magento-only-ruleset.xml +++ b/Magento2/magento-only-ruleset.xml @@ -1,17 +1,17 @@ Magento Coding Standard sniffs applicable for Magento Open Source development only - + 5 warning - + 5 warning *\.php$ *\.phtml$ - + 5 warning *\.php$ From 88d9f59ec7844e4b2ef57bb65219228b891bb53b Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Tue, 19 Oct 2021 14:25:17 +0100 Subject: [PATCH 75/99] AC-206: Extracted Fframework only sniffs to a separate namespace --- .github/workflows/php.yml | 5 ++- .../Sniffs/Legacy/RestrictedCodeSniff.php | 37 ++----------------- .../Legacy/_files/restricted_classes.php | 13 +++++-- .../Legacy/_files/restricted_classes_ee.php | 32 ---------------- .../Legacy/AbstractJsSniffUnitTestCase.php | 33 ----------------- .../CopyrightAnotherExtensionsFilesSniff.php | 6 +-- .../Sniffs/Header}/CopyrightSniff.php | 8 ++-- .../Sniffs/Header}/LicenseSniff.php | 10 ++--- ...yrightAnotherExtensionsFilesUnitTest.1.xml | 0 ...pyrightAnotherExtensionsFilesUnitTest.2.js | 0 ...yrightAnotherExtensionsFilesUnitTest.3.xml | 0 ...pyrightAnotherExtensionsFilesUnitTest.4.js | 0 ...rightAnotherExtensionsFilesUnitTest.5.less | 0 ...opyrightAnotherExtensionsFilesUnitTest.php | 25 ++++++++++++- .../Tests/Header}/CopyrightUnitTest.1.inc | 0 .../Tests/Header}/CopyrightUnitTest.2.inc | 0 .../Tests/Header}/CopyrightUnitTest.3.inc | 0 .../Tests/Header}/CopyrightUnitTest.4.inc | 0 .../Tests/Header}/CopyrightUnitTest.5.inc | 0 .../Tests/Header}/CopyrightUnitTest.php | 4 +- .../Tests/Header}/LicenseUnitTest.1.inc | 0 .../Tests/Header}/LicenseUnitTest.2.inc | 0 .../Tests/Header}/LicenseUnitTest.3.xml | 0 .../Tests/Header}/LicenseUnitTest.4.xml | 0 .../Tests/Header}/LicenseUnitTest.5.less | 0 .../Tests/Header}/LicenseUnitTest.php | 4 +- .../ruleset.xml | 10 ++--- composer.json | 3 +- composer.lock | 11 +++--- 29 files changed, 69 insertions(+), 132 deletions(-) delete mode 100644 Magento2/Sniffs/Legacy/_files/restricted_classes_ee.php delete mode 100644 Magento2/Tests/Legacy/AbstractJsSniffUnitTestCase.php rename {Magento2/Sniffs/Legacy => Magento2Framework/Sniffs/Header}/CopyrightAnotherExtensionsFilesSniff.php (96%) rename {Magento2/Sniffs/Legacy => Magento2Framework/Sniffs/Header}/CopyrightSniff.php (96%) rename {Magento2/Sniffs/Legacy => Magento2Framework/Sniffs/Header}/LicenseSniff.php (97%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightAnotherExtensionsFilesUnitTest.1.xml (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightAnotherExtensionsFilesUnitTest.2.js (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightAnotherExtensionsFilesUnitTest.3.xml (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightAnotherExtensionsFilesUnitTest.4.js (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightAnotherExtensionsFilesUnitTest.5.less (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightAnotherExtensionsFilesUnitTest.php (64%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightUnitTest.1.inc (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightUnitTest.2.inc (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightUnitTest.3.inc (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightUnitTest.4.inc (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightUnitTest.5.inc (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/CopyrightUnitTest.php (95%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/LicenseUnitTest.1.inc (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/LicenseUnitTest.2.inc (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/LicenseUnitTest.3.xml (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/LicenseUnitTest.4.xml (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/LicenseUnitTest.5.less (100%) rename {Magento2/Tests/Legacy => Magento2Framework/Tests/Header}/LicenseUnitTest.php (95%) rename Magento2/magento-only-ruleset.xml => Magento2Framework/ruleset.xml (59%) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 66010067..7e64fe7a 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -59,4 +59,7 @@ jobs: run: vendor/bin/phpunit - name: Run code style suite - run: vendor/bin/phpcs --standard=Magento2 Magento2/Helpers/ Magento2/Sniffs + run: vendor/bin/phpcs --standard=Magento2 Magento2/Helpers Magento2/Sniffs Magento2Framework/Sniffs + + - name: Run framework suite + run: vendor/bin/phpcs --standard=Magento2Framework Magento2/Helpers Magento2/Sniffs Magento2Framework/Sniffs diff --git a/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php b/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php index a0c0113f..62ee2d4e 100644 --- a/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php +++ b/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php @@ -37,7 +37,8 @@ class RestrictedCodeSniff implements Sniff */ public function __construct() { - $this->loadData('restricted_classes*.php'); + // phpcs:ignore Magento2.Security.IncludeFile.FoundIncludeFile + $this->classes = include __DIR__ . '/_files/restricted_classes.php'; } /** @@ -56,7 +57,7 @@ public function register() */ public function process(File $phpcsFile, $stackPtr) { - // phpcs:ignore + // phpcs:ignore Magento2.Functions.DiscouragedFunction if (array_key_exists(basename($phpcsFile->getFilename()), $this->fixtureFiles)) { return; } @@ -99,36 +100,4 @@ private function isExcluded(string $token, File $phpcsFile): bool } return false; } - - /** - * Loads and merges data from fixtures - * - * @param string $filePattern - * @return void - */ - private function loadData(string $filePattern) - { - // phpcs:ignore - foreach (glob(__DIR__ . '/_files/' . $filePattern) as $file) { - $relativePath = str_replace( - '\\', - '/', - str_replace(__DIR__ . DIRECTORY_SEPARATOR, '', $file) - ); - array_push($this->fixtureFiles, $relativePath); - $this->classes = array_merge_recursive($this->classes, $this->readList($file)); - } - } - - /** - * Isolate including a file into a method to reduce scope - * - * @param string $file - * @return array - */ - private function readList($file) - { - // phpcs:ignore - return include $file; - } } diff --git a/Magento2/Sniffs/Legacy/_files/restricted_classes.php b/Magento2/Sniffs/Legacy/_files/restricted_classes.php index 56a2e510..1052b994 100644 --- a/Magento2/Sniffs/Legacy/_files/restricted_classes.php +++ b/Magento2/Sniffs/Legacy/_files/restricted_classes.php @@ -17,7 +17,8 @@ 'exclude' => [ 'Magento/Framework/DB/Select.php', 'Magento/Framework/DB/Adapter/Pdo/Mysql.php', - 'Magento/Framework/Model/ResourceModel/Iterator.php' + 'Magento/Framework/Model/ResourceModel/Iterator.php', + 'Magento/ResourceConnections/DB/Adapter/Pdo/MysqlProxy.php' ] ], 'Zend_Db_Adapter_Pdo_Mysql' => [ @@ -48,7 +49,10 @@ 'Magento/Framework/Flag.php', 'Magento/Widget/Setup/LayoutUpdateConverter.php', 'Magento/Cms/Setup/ContentConverter.php', - 'Magento/Framework/Unserialize/Test/Unit/UnserializeTest.php' + 'Magento/Framework/Unserialize/Test/Unit/UnserializeTest.php', + 'Magento/Framework/Test/Unit/FlagTest.php', + 'Magento/Staging/Test/Unit/Model/Update/FlagTest.php', + 'Magento/Logging/Test/Unit/Setup/ObjectConverterTest.php' ] ], 'ArrayObject' => [ @@ -67,7 +71,10 @@ 'Magento/Framework/Indexer/Test/Unit/BatchTest.php', 'Magento/Framework/View/Element/UiComponent/ArrayObjectFactory.php', 'Magento/Framework/View/Element/UiComponent/Config/Provider/Component/Definition.php', - 'Magento/Framework/Indexer/Action/Base.php' + 'Magento/Framework/Indexer/Action/Base.php', + 'Magento/MultipleWishlist/Test/Unit/Model/Search/Strategy/EmailTest.php', + 'Magento/Rma/Test/Unit/Model/RmaRepositoryTest.php', + 'Magento/Rma/Test/Unit/Model/Status/HistoryRepositoryTest.php' ] ], 'Magento\Framework\View\Element\UiComponent\ArrayObjectFactory' => [ diff --git a/Magento2/Sniffs/Legacy/_files/restricted_classes_ee.php b/Magento2/Sniffs/Legacy/_files/restricted_classes_ee.php deleted file mode 100644 index 0c633bb9..00000000 --- a/Magento2/Sniffs/Legacy/_files/restricted_classes_ee.php +++ /dev/null @@ -1,32 +0,0 @@ - will be suggested to be used instead. - * Use to specify files and directories that are allowed to use restricted classes. - * - * Format: array(, [, array()]]) - * - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -return [ - 'Zend_Db_Select' => [ - 'exclude' => [ - 'Magento/ResourceConnections/DB/Adapter/Pdo/MysqlProxy.php' - ], - ], - 'Magento\Framework\Serialize\Serializer\Serialize' => [ - 'exclude' => [ - 'Magento/Framework/Test/Unit/FlagTest.php', - 'Magento/Staging/Test/Unit/Model/Update/FlagTest.php', - 'Magento/Logging/Test/Unit/Setup/ObjectConverterTest.php' - ] - ], - 'ArrayObject' => [ - 'exclude' => [ - 'Magento/MultipleWishlist/Test/Unit/Model/Search/Strategy/EmailTest.php', - 'Magento/Rma/Test/Unit/Model/RmaRepositoryTest.php', - 'Magento/Rma/Test/Unit/Model/Status/HistoryRepositoryTest.php' - ] - ] -]; diff --git a/Magento2/Tests/Legacy/AbstractJsSniffUnitTestCase.php b/Magento2/Tests/Legacy/AbstractJsSniffUnitTestCase.php deleted file mode 100644 index 4b891a3c..00000000 --- a/Magento2/Tests/Legacy/AbstractJsSniffUnitTestCase.php +++ /dev/null @@ -1,33 +0,0 @@ -extensions = array_merge( - $config->extensions, - [ - 'js' => 'PHP' - ] - ); - - $GLOBALS['PHP_CODESNIFFER_CONFIG'] = $config; - } -} diff --git a/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php b/Magento2Framework/Sniffs/Header/CopyrightAnotherExtensionsFilesSniff.php similarity index 96% rename from Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php rename to Magento2Framework/Sniffs/Header/CopyrightAnotherExtensionsFilesSniff.php index a1d6995b..bfc36afe 100644 --- a/Magento2/Sniffs/Legacy/CopyrightAnotherExtensionsFilesSniff.php +++ b/Magento2Framework/Sniffs/Header/CopyrightAnotherExtensionsFilesSniff.php @@ -5,7 +5,7 @@ */ declare(strict_types = 1); -namespace Magento2\Sniffs\Legacy; +namespace Magento2Framework\Sniffs\Header; use Magento2\Sniffs\Less\TokenizerSymbolsInterface; use PHP_CodeSniffer\Files\File; @@ -24,7 +24,7 @@ class CopyrightAnotherExtensionsFilesSniff implements Sniff * @var array */ public $supportedTokenizers = [TokenizerSymbolsInterface::TOKENIZER_CSS, 'PHP']; - + /** * @inheritDoc */ @@ -44,7 +44,7 @@ public function process(File $phpcsFile, $stackPtr) if ($stackPtr > 0) { return; } - + $fileText = $phpcsFile->getTokensAsString($stackPtr, count($phpcsFile->getTokens())); $adobeCopyrightFound = preg_match(self::COPYRIGHT_ADOBE, $fileText); diff --git a/Magento2/Sniffs/Legacy/CopyrightSniff.php b/Magento2Framework/Sniffs/Header/CopyrightSniff.php similarity index 96% rename from Magento2/Sniffs/Legacy/CopyrightSniff.php rename to Magento2Framework/Sniffs/Header/CopyrightSniff.php index f4ccd647..81442207 100644 --- a/Magento2/Sniffs/Legacy/CopyrightSniff.php +++ b/Magento2Framework/Sniffs/Header/CopyrightSniff.php @@ -5,7 +5,7 @@ */ declare(strict_types = 1); -namespace Magento2\Sniffs\Legacy; +namespace Magento2Framework\Sniffs\Header; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; @@ -13,10 +13,10 @@ class CopyrightSniff implements Sniff { private const WARNING_CODE = 'FoundCopyrightMissingOrWrongFormat'; - + private const COPYRIGHT_MAGENTO_TEXT = 'Copyright © Magento, Inc. All rights reserved.'; private const COPYRIGHT_ADOBE = '/Copyright \d+ Adobe/'; - + /** * @inheritdoc */ @@ -24,7 +24,7 @@ public function register() { return [T_OPEN_TAG]; } - + /** * @inheritDoc */ diff --git a/Magento2/Sniffs/Legacy/LicenseSniff.php b/Magento2Framework/Sniffs/Header/LicenseSniff.php similarity index 97% rename from Magento2/Sniffs/Legacy/LicenseSniff.php rename to Magento2Framework/Sniffs/Header/LicenseSniff.php index c6f8ba8a..667b3b2b 100644 --- a/Magento2/Sniffs/Legacy/LicenseSniff.php +++ b/Magento2Framework/Sniffs/Header/LicenseSniff.php @@ -5,7 +5,7 @@ */ declare(strict_types = 1); -namespace Magento2\Sniffs\Legacy; +namespace Magento2Framework\Sniffs\Header; use Magento2\Sniffs\Less\TokenizerSymbolsInterface; use PHP_CodeSniffer\Files\File; @@ -21,9 +21,9 @@ class LicenseSniff implements Sniff public $supportedTokenizers = [TokenizerSymbolsInterface::TOKENIZER_CSS, 'PHP']; private const WARNING_CODE = 'FoundLegacyTextInCopyright'; - + private const LEGACY_TEXTS = ['Irubin Consulting Inc', 'DBA Varien', 'Magento Inc']; - + /** * @inheritdoc */ @@ -34,7 +34,7 @@ public function register() T_INLINE_HTML ]; } - + /** * @inheritDoc */ @@ -42,7 +42,7 @@ public function process(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); $content = null; - + if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_STRING) { $content = $tokens[$stackPtr]['content']; } diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.1.xml b/Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.1.xml similarity index 100% rename from Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.1.xml rename to Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.1.xml diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.2.js b/Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.2.js similarity index 100% rename from Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.2.js rename to Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.2.js diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.3.xml b/Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.3.xml similarity index 100% rename from Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.3.xml rename to Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.3.xml diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.4.js b/Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.4.js similarity index 100% rename from Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.4.js rename to Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.4.js diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.5.less b/Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.5.less similarity index 100% rename from Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.5.less rename to Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.5.less diff --git a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php b/Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.php similarity index 64% rename from Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php rename to Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.php index 4223e600..c1b06f52 100644 --- a/Magento2/Tests/Legacy/CopyrightAnotherExtensionsFilesUnitTest.php +++ b/Magento2Framework/Tests/Header/CopyrightAnotherExtensionsFilesUnitTest.php @@ -3,10 +3,31 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento2\Tests\Legacy; +namespace Magento2Framework\Tests\Header; -class CopyrightAnotherExtensionsFilesUnitTest extends AbstractJsSniffUnitTestCase +use PHP_CodeSniffer\Config; +use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; + +class CopyrightAnotherExtensionsFilesUnitTest extends AbstractSniffUnitTest { + /** + * @inheritDoc + */ + protected function setUp(): void + { + parent::setUp(); + + $config = new Config(); + $config->extensions = array_merge( + $config->extensions, + [ + 'js' => 'PHP' + ] + ); + + $GLOBALS['PHP_CODESNIFFER_CONFIG'] = $config; + } + /** * @inheritdoc */ diff --git a/Magento2/Tests/Legacy/CopyrightUnitTest.1.inc b/Magento2Framework/Tests/Header/CopyrightUnitTest.1.inc similarity index 100% rename from Magento2/Tests/Legacy/CopyrightUnitTest.1.inc rename to Magento2Framework/Tests/Header/CopyrightUnitTest.1.inc diff --git a/Magento2/Tests/Legacy/CopyrightUnitTest.2.inc b/Magento2Framework/Tests/Header/CopyrightUnitTest.2.inc similarity index 100% rename from Magento2/Tests/Legacy/CopyrightUnitTest.2.inc rename to Magento2Framework/Tests/Header/CopyrightUnitTest.2.inc diff --git a/Magento2/Tests/Legacy/CopyrightUnitTest.3.inc b/Magento2Framework/Tests/Header/CopyrightUnitTest.3.inc similarity index 100% rename from Magento2/Tests/Legacy/CopyrightUnitTest.3.inc rename to Magento2Framework/Tests/Header/CopyrightUnitTest.3.inc diff --git a/Magento2/Tests/Legacy/CopyrightUnitTest.4.inc b/Magento2Framework/Tests/Header/CopyrightUnitTest.4.inc similarity index 100% rename from Magento2/Tests/Legacy/CopyrightUnitTest.4.inc rename to Magento2Framework/Tests/Header/CopyrightUnitTest.4.inc diff --git a/Magento2/Tests/Legacy/CopyrightUnitTest.5.inc b/Magento2Framework/Tests/Header/CopyrightUnitTest.5.inc similarity index 100% rename from Magento2/Tests/Legacy/CopyrightUnitTest.5.inc rename to Magento2Framework/Tests/Header/CopyrightUnitTest.5.inc diff --git a/Magento2/Tests/Legacy/CopyrightUnitTest.php b/Magento2Framework/Tests/Header/CopyrightUnitTest.php similarity index 95% rename from Magento2/Tests/Legacy/CopyrightUnitTest.php rename to Magento2Framework/Tests/Header/CopyrightUnitTest.php index 1100bc53..065f6460 100644 --- a/Magento2/Tests/Legacy/CopyrightUnitTest.php +++ b/Magento2Framework/Tests/Header/CopyrightUnitTest.php @@ -3,7 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento2\Tests\Legacy; +namespace Magento2Framework\Tests\Header; use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; @@ -25,7 +25,7 @@ public function getWarningList($testFile = ''): array if ($testFile === 'CopyrightUnitTest.4.inc' || $testFile === 'CopyrightUnitTest.5.inc') { return []; } - + if ($testFile === 'CopyrightUnitTest.1.inc') { return [ 1 => 1, diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.1.inc b/Magento2Framework/Tests/Header/LicenseUnitTest.1.inc similarity index 100% rename from Magento2/Tests/Legacy/LicenseUnitTest.1.inc rename to Magento2Framework/Tests/Header/LicenseUnitTest.1.inc diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.2.inc b/Magento2Framework/Tests/Header/LicenseUnitTest.2.inc similarity index 100% rename from Magento2/Tests/Legacy/LicenseUnitTest.2.inc rename to Magento2Framework/Tests/Header/LicenseUnitTest.2.inc diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.3.xml b/Magento2Framework/Tests/Header/LicenseUnitTest.3.xml similarity index 100% rename from Magento2/Tests/Legacy/LicenseUnitTest.3.xml rename to Magento2Framework/Tests/Header/LicenseUnitTest.3.xml diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.4.xml b/Magento2Framework/Tests/Header/LicenseUnitTest.4.xml similarity index 100% rename from Magento2/Tests/Legacy/LicenseUnitTest.4.xml rename to Magento2Framework/Tests/Header/LicenseUnitTest.4.xml diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.5.less b/Magento2Framework/Tests/Header/LicenseUnitTest.5.less similarity index 100% rename from Magento2/Tests/Legacy/LicenseUnitTest.5.less rename to Magento2Framework/Tests/Header/LicenseUnitTest.5.less diff --git a/Magento2/Tests/Legacy/LicenseUnitTest.php b/Magento2Framework/Tests/Header/LicenseUnitTest.php similarity index 95% rename from Magento2/Tests/Legacy/LicenseUnitTest.php rename to Magento2Framework/Tests/Header/LicenseUnitTest.php index edcca88e..df32d8df 100644 --- a/Magento2/Tests/Legacy/LicenseUnitTest.php +++ b/Magento2Framework/Tests/Header/LicenseUnitTest.php @@ -3,7 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento2\Tests\Legacy; +namespace Magento2Framework\Tests\Header; use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; @@ -25,7 +25,7 @@ public function getWarningList($testFile = ''): array if ($testFile === 'LicenseUnitTest.1.inc' || $testFile === 'LicenseUnitTest.3.xml') { return []; } - + if ($testFile === 'LicenseUnitTest.2.inc') { return [ 3 => 1, diff --git a/Magento2/magento-only-ruleset.xml b/Magento2Framework/ruleset.xml similarity index 59% rename from Magento2/magento-only-ruleset.xml rename to Magento2Framework/ruleset.xml index bace947f..434d10cc 100644 --- a/Magento2/magento-only-ruleset.xml +++ b/Magento2Framework/ruleset.xml @@ -1,17 +1,17 @@ - - Magento Coding Standard sniffs applicable for Magento Open Source development only - + + Magento Coding Standard sniffs applicable for the framework testing only + 5 warning - + 5 warning *\.php$ *\.phtml$ - + 5 warning *\.php$ diff --git a/composer.json b/composer.json index 9b99b887..ede320cf 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,8 @@ "PHP_CodeSniffer/Tokenizers/" ], "psr-4": { - "Magento2\\": "Magento2/" + "Magento2\\": "Magento2/", + "Magento2Framework\\": "Magento2Framework/" } }, "scripts": { diff --git a/composer.lock b/composer.lock index a62a83dc..0e7a89fc 100644 --- a/composer.lock +++ b/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "squizlabs/php_codesniffer", - "version": "3.6.0", + "version": "3.6.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625" + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ffced0d2c8fa8e6cdc4d695a743271fab6c38625", - "reference": "ffced0d2c8fa8e6cdc4d695a743271fab6c38625", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/f268ca40d54617c6e06757f83f699775c9b3ff2e", + "reference": "f268ca40d54617c6e06757f83f699775c9b3ff2e", "shasum": "" }, "require": { @@ -60,7 +60,7 @@ "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2021-04-09T00:54:41+00:00" + "time": "2021-10-11T04:00:11+00:00" }, { "name": "webonyx/graphql-php", @@ -1924,6 +1924,7 @@ "type": "github" } ], + "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { From dd1e3f6d78e6c28e5ba564fd784f0cc2ee718b3d Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Tue, 19 Oct 2021 14:33:58 +0100 Subject: [PATCH 76/99] AC-206: Optimized eslint test command --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 7e64fe7a..1af77466 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -42,7 +42,7 @@ jobs: - name: Install dependencies run: npm install - name: Run ESLint - run: npm run eslint -- eslint/rules Magento2 --ignore-pattern 'Magento2/Tests/Eslint/*Test.js' + run: npm run eslint -- eslint/rules - name: Run JSCS run: npm run jscs eslint/rules Magento2 From 1bd89ac238d6a718744daec62d8a546a02eb2b19 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 10:56:28 +0200 Subject: [PATCH 77/99] AC-1549: Create codes for each type of returned error / warning --- Magento2/Sniffs/Legacy/AbstractBlockSniff.php | 12 +- Magento2/Sniffs/Legacy/DiConfigSniff.php | 10 +- Magento2/Sniffs/Legacy/EmailTemplateSniff.php | 7 +- .../Sniffs/Legacy/InstallUpgradeSniff.php | 21 ++- Magento2/Sniffs/Legacy/LayoutSniff.php | 7 +- .../Legacy/ObsoleteConfigNodesSniff.php | 177 ++++++++++++++---- .../Sniffs/Legacy/ObsoleteConnectionSniff.php | 20 +- .../Sniffs/Legacy/ObsoleteResponseSniff.php | 20 +- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 17 +- .../Sniffs/Legacy/RestrictedCodeSniff.php | 3 +- Magento2/Sniffs/Legacy/WidgetXMLSniff.php | 7 +- .../Legacy/_files/restricted_classes.php | 5 + .../NamingConvention/ReservedWordsSniff.php | 42 ++++- 13 files changed, 267 insertions(+), 81 deletions(-) diff --git a/Magento2/Sniffs/Legacy/AbstractBlockSniff.php b/Magento2/Sniffs/Legacy/AbstractBlockSniff.php index de9884d2..705db1b0 100644 --- a/Magento2/Sniffs/Legacy/AbstractBlockSniff.php +++ b/Magento2/Sniffs/Legacy/AbstractBlockSniff.php @@ -15,12 +15,8 @@ class AbstractBlockSniff implements Sniff private const CHILD_HTML_METHOD = 'getChildHtml'; private const CHILD_CHILD_HTML_METHOD = 'getChildChildHtml'; - /** - * Error violation code. - * - * @var string - */ - protected $errorCode = 'FoundCountOfParametersIncorrect'; + private const ERROR_CODE_THIRD_PARAMETER = 'ThirdParameterNotNeeded'; + private const ERROR_CODE_FOURTH_PARAMETER = 'FourthParameterNotNeeded'; /** * @inheritdoc @@ -52,14 +48,14 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addError( '3rd parameter is not needed anymore for getChildHtml()', $stackPtr, - $this->errorCode + self::ERROR_CODE_THIRD_PARAMETER ); } if ($content === self::CHILD_CHILD_HTML_METHOD && $paramsCount >= 4) { $phpcsFile->addError( '4th parameter is not needed anymore for getChildChildHtml()', $stackPtr, - $this->errorCode + self::ERROR_CODE_FOURTH_PARAMETER ); } } diff --git a/Magento2/Sniffs/Legacy/DiConfigSniff.php b/Magento2/Sniffs/Legacy/DiConfigSniff.php index 954c32e0..89c0025d 100644 --- a/Magento2/Sniffs/Legacy/DiConfigSniff.php +++ b/Magento2/Sniffs/Legacy/DiConfigSniff.php @@ -11,7 +11,13 @@ class DiConfigSniff implements Sniff { - private const WARNING_CODE = 'FoundObsoleteAttribute'; + private $obsoleteDiNodesWarningCodes = [ + ' 'FoundObsoleteParamNode', + ' 'FoundObsoleteInstanceNode', + ' 'FoundObsoleteArrayNode', + ' 'FoundObsoleteValueNode', + ]; /** * @var string[] Associative array containing the obsolete nodes and the message to display when they are found. @@ -46,7 +52,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addWarning( $message, $stackPtr, - self::WARNING_CODE + $this->obsoleteDiNodesWarningCodes[$element] ); } } diff --git a/Magento2/Sniffs/Legacy/EmailTemplateSniff.php b/Magento2/Sniffs/Legacy/EmailTemplateSniff.php index 17ebbf08..1cff51fe 100644 --- a/Magento2/Sniffs/Legacy/EmailTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/EmailTemplateSniff.php @@ -19,7 +19,10 @@ class EmailTemplateSniff implements Sniff '/\{\{escapehtml.*?\}\}/i' => 'Directive {{escapehtml}} is obsolete. Use {{var}} instead.', ]; - private const ERROR_CODE = 'FoundObsoleteEmailDirective'; + private $errorCodes = [ + '/\{\{htmlescape.*?\}\}/i' => 'FoundObsoleteHtmlescapeDirective', + '/\{\{escapehtml.*?\}\}/i' => 'FoundObsoleteEscapehtmlDirective' + ]; /** * @inheritdoc @@ -42,7 +45,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addError( $errorMessage, $stackPtr, - self::ERROR_CODE + $this->errorCodes[$directiveRegex] ); } } diff --git a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php index c7df570c..aad0e56b 100644 --- a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php +++ b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php @@ -13,7 +13,7 @@ class InstallUpgradeSniff implements Sniff { - private const ERROR_CODE = 'obsoleteScript'; + private const ERROR_CODE = 'invalidDirectory'; /** * @var string[] @@ -30,13 +30,28 @@ class InstallUpgradeSniff implements Sniff . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', 'UpgradeSchema' => 'UpgradeSchema scripts are obsolete. ' . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', - 'UpgradeData' => 'UpgradeSchema scripts are obsolete. ' + 'UpgradeData' => 'UpgradeData scripts are obsolete. ' . 'Please use data patches approach in module\'s Setup/Patch/Data dir', 'data-upgrade-' => 'Upgrade scripts are obsolete. ' . 'Please use data patches approach in module\'s Setup/Patch/Data dir', 'recurring' => 'Recurring scripts are obsolete. Please create class Recurring in module\'s Setup folder', ]; + /** + * @var string[] + */ + private $wrongPrefixesErrorCodes = [ + 'install-' => 'obsoleteInstallScript', + 'InstallSchema' => 'obsoleteInstallSchemaScript', + 'InstallData' => 'obsoleteInstallDataScript', + 'data-install-' => 'obsoleteDataInstallScript', + 'upgrade-' => 'obsoleteUpgradeScript', + 'UpgradeSchema' => 'obsoleteUpgradeSchemaScript', + 'UpgradeData' => 'obsoleteUpgradeDataScript', + 'data-upgrade-' => 'obsoleteDataUpgradeScript', + 'recurring' => 'obsoleteRecurringScript', + ]; + /** * @inheritdoc */ @@ -60,7 +75,7 @@ public function process(File $phpcsFile, $stackPtr) foreach ($this->wrongPrefixes as $prefix => $errorMessage) { if (strpos($fileInfo->getFilename(), $prefix) === 0) { - $phpcsFile->addError($errorMessage, 0, self::ERROR_CODE); + $phpcsFile->addError($errorMessage, 0, $this->wrongPrefixesErrorCodes[$prefix]); } } diff --git a/Magento2/Sniffs/Legacy/LayoutSniff.php b/Magento2/Sniffs/Legacy/LayoutSniff.php index 3a2c2044..78b67b21 100644 --- a/Magento2/Sniffs/Legacy/LayoutSniff.php +++ b/Magento2/Sniffs/Legacy/LayoutSniff.php @@ -19,8 +19,9 @@ class LayoutSniff implements Sniff { private const ERROR_CODE_XML = 'WrongXML'; private const ERROR_CODE_NOT_ALLOWED = 'NotAllowed'; - private const ERROR_CODE_OBSOLETE = 'Obsolete'; + private const ERROR_CODE_OBSOLETE_BLOCK = 'ObsoleteBlock'; private const ERROR_CODE_OBSOLETE_CLASS = 'ObsoleteClass'; + private const ERROR_CODE_OBSOLETE_TOHTML_ATTRIBUTE = 'ObsoleteToHtmlAttribute'; private const ERROR_CODE_METHOD_NOT_ALLOWED = 'MethodNotAllowed'; private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_NOT_ALLOWED = 'CharacterNotAllowedInAttribute'; private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_EXPECTED = 'CharacterExpectedInAttribute'; @@ -254,7 +255,7 @@ private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFil $phpcsFile->addError( 'The block being referenced is removed.', dom_import_simplexml($reference)->getLineNo()-1, - self::ERROR_CODE_OBSOLETE + self::ERROR_CODE_OBSOLETE_BLOCK ); } } @@ -317,7 +318,7 @@ private function testOutputAttribute(SimpleXMLElement $layout, File $phpcsFile): $phpcsFile->addError( 'output="toHtml" is obsolete. Use output="1"', dom_import_simplexml($elements[0])->getLineNo()-1, - self::ERROR_CODE_OBSOLETE + self::ERROR_CODE_OBSOLETE_TOHTML_ATTRIBUTE ); }; } diff --git a/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php index efc5fae7..9738d080 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php @@ -14,7 +14,104 @@ class ObsoleteConfigNodesSniff implements Sniff { private const ERROR_MESSAGE_CONFIG = "Nodes identified by XPath '%s' are obsolete. %s"; - private const ERROR_CODE_CONFIG = 'ObsoleteNodeInConfig'; + private const ERROR_CODE_CONFIG = 'WrongXML'; + private $obsoleteNodesErrorCodes = [ + '/config/global/fieldsets' => 'obsoleteNodeGlobalFieldsets', + '/config/global/cache/betatypes' => 'obsoleteNodeBetatypes', + '/config/admin/fieldsets' => 'obsoleteNodeAdminFieldsets', + '/config/general/locale' => 'obsoleteNodeGeneralLocale', + '/config/global/can_use_base_url' => 'obsoleteNodeGlobalCanUseBaseURL', + '/config/global/locale/allow/codes' => 'obsoleteNodeAllowCodes', + '/config/global/locale/allow/currencies' => 'obsoleteNodeAllowCurrencies', + '/config/global/mime/types' => 'obsoleteNodeMimeTypes', + '/config/global/models/*/deprecatedNode' => 'obsoleteNodeDeprecatedNode', + '/config/global/models/*/entities/*/table' => 'obsoleteNodeEntitiesTable', + '/config/global/models/*/class' => 'obsoleteNodeModelsClass', + '/config/global/helpers/*/class' => 'obsoleteNodeHelpersClass', + '/config/global/blocks/*/class' => 'obsoleteNodeBlocksClass', + '/config/global/models/*/resourceModel' => 'obsoleteNodeResourceModel', + '/config/global/page/layouts' => 'obsoleteNodePageLayouts', + '/config/global/cms/layouts' => 'obsoleteNodeCmsLayouts', + '/config/global/payment/cc/types/*/validator' => 'obsoleteNodeTypesValidator', + '/config/global/payment' => 'obsoleteNodeGlobalPayment', + '/config/adminhtml/menu' => 'obsoleteNodeAdminhtmlMenu', + '/config/adminhtml/acl' => 'obsoleteNodeAdminhtmlAcl', + '/config/adminhtml/global_search' => 'obsoleteNodeAdminhtmlGlobalSearch', + '/config/*[self::global|self::adminhtml|self::frontend]/di' => 'obsoleteNodeDi', + '/config/*[self::global|self::adminhtml|self::frontend]/events' => 'obsoleteNodeEvents', + '/config/*[self::global|self::adminhtml|self::frontend]/routers' => 'obsoleteNodeRouters', + '/config/global/importexport' => 'obsoleteNodeGlobalImportExport', + '/config/global/catalog/product/type' => 'obsoleteNodeProductType', + '/config/global/catalog/product/options' => 'obsoleteNodeProductOptions', + '/config/global/catalog/product/media/image_types' => 'obsoleteNodeMediaImageTypes', + '/config/global/eav_attributes' => 'obsoleteNodeEavAttributes', + '/config/global/index' => 'obsoleteNodeGlobalIndex', + '/config/global/catalogrule' => 'obsoleteNodeGlobalCatalogRule', + '/config/global/salesrule' => 'obsoleteNodeGlobalSalesRule', + '/config/global/session' => 'obsoleteNodeGlobalSession', + '/config/global/ignore_user_agents' => 'obsoleteNodeGlobalIgnoreUserAgents', + '/config/global/request' => 'obsoleteNodeGlobalRequest', + '/config/global/secure_url' => 'obsoleteNodeGlobalSecureUrl', + '/config/global/dev' => 'obsoleteNodeGlobalDev', + '/config/global/webapi' => 'obsoleteNodeGlobalWebapi', + '/config/global/cms' => 'obsoleteNodeGlobalCms', + '/config/global/widget' => 'obsoleteNodeGlobalWidget', + '/config/global/catalog/product/flat/max_index_count' => 'obsoleteNodeFlatMaxIndexCount', + '/config/global/catalog/product/flat/attribute_groups' => 'obsoleteNodeFlatAttributeGroups', + '/config/global/catalog/product/flat/add_filterable_attributes' => 'obsoleteNodeFlatAddIterableAttributes', + '/config/global/catalog/product/flat/add_child_data' => 'obsoleteNodeFlatAddChildData', + '/config/global/catalog/content/template_filter' => 'obsoleteNodeContentTemplateFilter', + '/config/frontend/catalog/per_page_values/list' => 'obsoleteNodePerPageValuesList', + '/config/frontend/catalog/per_page_values/grid' => 'obsoleteNodePerPageValuesGrid', + '/config/global/catalog/product/design' => 'obsoleteNodeProductDesign', + '/config/global/catalog/product/attributes' => 'obsoleteNodeProductAttributes', + '/config/global/eav_frontendclasses' => 'obsoleteNodeGlobalEavFrontendClasses', + '/config/global/resources' => 'obsoleteNodeGlobalResources', + '/config/global/resource' => 'obsoleteNodeGlobalResource', + '/config/*/events/core_block_abstract_to_html_after' => 'obsoleteNodeEventsCoreBlockAbstract', + '/config/*/events/catalog_controller_product_delete' => 'obsoleteNodeEventsCatalogController', + '/config//observers/*/args' => 'obsoleteNodeObserversArgs', + '/config/default/design/theme' => 'obsoleteNodeDesignTheme', + '/config/global/theme' => 'obsoleteNodeGlobalTheme', + '/config/default/web/*/base_js_url' => 'obsoleteNodeWebBaseJsUrl', + '/config/default/web/*/base_skin_url' => 'obsoleteNodeWebBaseSkinUrl', + '/config/default/web/*/base_cache_url' => 'obsoleteNodeWebBaseCacheUrl', + '/config/global/cache/types/*/tags' => 'obsoleteNodeTypesTags', + '/config/global/disable_local_modules' => 'obsoleteNodeGlobalDisableLocalModules', + '/config/global/newsletter/template_filter' => 'obsoleteNodeNewsletterTemplateFilter', + '/config/*/layout' => 'obsoleteNodeConfigLayout', + '/config/frontend/product/collection/attributes' => 'obsoleteNodeProductCollectionAttributes', + '/config/frontend/category/collection/attributes' => 'obsoleteNodeCategoryCollectionAttributes', + '/config/global/sales/quote/item/product_attributes' => 'obsoleteNodeQuoteItemProductAttributes', + '/config/global/wishlist/item/product_attributes' => 'obsoleteNodeWishlistItemProductAttributes', + '/config/global/catalog/product/flat/attribute_nodes' => 'obsoleteNodeFlatAttributeNodes', + '/config/global/customer/address/formats' => 'obsoleteNodeCustomerAddressFormats', + '/config/global/pdf' => 'obsoleteNodeGlobalPdf', + '/config/install' => 'obsoleteNodeConfigInstall', + '/config/install/design' => 'obsoleteNodeConfigInstallDesign', + '/config/adminhtml/design' => 'obsoleteNodeConfigAdminhtmlDesign', + '/config/frontend/design' => 'obsoleteNodeConfigFrontendDesign', + '/config/crontab' => 'obsoleteNodeConfigCrontab', + '/config/global/areas' => 'obsoleteNodeGlobalAreas', + '/config/vde' => 'obsoleteNodeConfigVde', + '/config/global/ignoredModules' => 'obsoleteNodeGlobalIgnoredModules', + '/config/global/helpers' => 'obsoleteNodeGlobalHelpers', + '/config/global/external_cache' => 'obsoleteNodeGlobalExternalCache', + '/config/global/currency/import/services' => 'obsoleteNodeCurrencyImportServices', + '/config/global/template' => 'obsoleteNodeGlobalTemplate', + '/config/default/general/file/sitemap_generate_valid_paths' => 'obsoleteNodeFileSitemap', + '/config/dev/css/minify_adapter' => 'obsoleteNodeCssMinify', + '/config/dev/js/minify_adapter' => 'obsoleteNodeJsMinify', + '/config/global/full_page_cache' => 'obsoleteNodeGlobalFullPageCache', + '/config/adminhtml/enterprise/admingws' => 'obsoleteNodeEnterpriseAdmingws', + '/config/adminhtml/enterprise/websiterestriction' => 'obsoleteNodeEnterpriseWebsiteRestriction', + '/config/global/enterprise_cms' => 'obsoleteNodeGlobalEnterpriseCms', + '/config/global/enterprise/banner' => 'obsoleteNodeGlobalEnterpriseBanner', + '/config/global/enterprise/giftcardaccount' => 'obsoleteNodeGlobalEnterpriseGiftCardAccount', + '/config/global/skip_process_modules_updates' => 'obsoleteNodeGlobalSkipProcess', + '/config/system/page_cache' => 'obsoleteNodeSystemPageCache', + '/config/system/cms/content/versioning' => 'obsoleteNodeContentVersioning', + ]; /** * @inheritdoc @@ -63,7 +160,7 @@ public function process(File $phpcsFile, $stackPtr) $suggestion ), dom_import_simplexml($match)->getLineNo()-1, - self::ERROR_CODE_CONFIG + $this->obsoleteNodesErrorCodes[$xpath] ); } } @@ -95,15 +192,15 @@ private function getObsoleteNodes(): array '/config/global/cache/betatypes' => '', '/config/admin/fieldsets' => '', '/config/general/locale' => - 'This configuration moved to Di configuration of \Magento\Framework\Locale\ConfigInterface', + 'This configuration moved to DI configuration of \Magento\Framework\Locale\ConfigInterface', '/config/global/can_use_base_url' => - 'This configuration moved to Di configuration of \Magento\Backend\App\Action\Context class', + 'This configuration moved to DI configuration of \Magento\Backend\App\Action\Context class', '/config/global/locale/allow/codes' => - 'This configuration moved to Di configuration of \Magento\Framework\Locale\ConfigInterface', + 'This configuration moved to DI configuration of \Magento\Framework\Locale\ConfigInterface', '/config/global/locale/allow/currencies' => - 'This configuration moved to Di configuration of \Magento\Framework\Locale\ConfigInterface', + 'This configuration moved to DI configuration of \Magento\Framework\Locale\ConfigInterface', '/config/global/mime/types' => - 'This configuration moved to Di configuration for \Magento\Downloadable\Helper\File class', + 'This configuration moved to DI configuration for \Magento\Downloadable\Helper\File class', '/config/global/models/*/deprecatedNode' => '', '/config/global/models/*/entities/*/table' => '', '/config/global/models/*/class' => '', @@ -118,68 +215,68 @@ private function getObsoleteNodes(): array '/config/adminhtml/menu' => 'Move them to adminhtml.xml.', '/config/adminhtml/acl' => 'Move them to adminhtml.xml.', '/config/adminhtml/global_search' => - 'This configuration moved to Di configuration of \Magento\Backend\Controller\Index', + 'This configuration moved to DI configuration of \Magento\Backend\Controller\Index', '/config/*[self::global|self::adminhtml|self::frontend]/di' => 'This configuration moved to di.xml file', '/config/*[self::global|self::adminhtml|self::frontend]/events' => 'This configuration moved to events.xml file', '/config/*[self::global|self::adminhtml|self::frontend]/routers' => 'Routes configuration moved to routes.xml file,' . - 'routers list can be set through Di configuration of \Magento\Framework\App\RouterList model', + 'routers list can be set through DI configuration of \Magento\Framework\App\RouterList model', '/config/global/importexport' => 'This configuration moved to import.xml and export.xml files', '/config/global/catalog/product/type' => 'This configuration moved to product_types.xml file', '/config/global/catalog/product/options' => 'This configuration moved to product_options.xml file', - '/config/global/catalog/product/media/image_types' => 'This configuration moved to Di configuration of ' . + '/config/global/catalog/product/media/image_types' => 'This configuration moved to DI configuration of ' . '\Magento\Backend\Block\Catalog\Product\Frontend\Product\Watermark', '/config/global/eav_attributes' => 'This configuration moved to eav_attributes.xml file', '/config/global/index' => 'This configuration moved to indexers.xml file', '/config/global/catalogrule' => - 'This configuration moved to Di configuration of \Magento\CatalogRule\Model\Rule', + 'This configuration moved to DI configuration of \Magento\CatalogRule\Model\Rule', '/config/global/salesrule' => - 'This configuration moved to Di configuration of \Magento\SalesRule\Helper\Coupon', + 'This configuration moved to DI configuration of \Magento\SalesRule\Helper\Coupon', '/config/global/session' => - 'This configuration moved to Di configuration of \Magento\Framework\Session\Validator', + 'This configuration moved to DI configuration of \Magento\Framework\Session\Validator', '/config/global/ignore_user_agents' => - 'This configuration moved to Di configuration of \Magento\Log\Model\Visitor', + 'This configuration moved to DI configuration of \Magento\Log\Model\Visitor', '/config/global/request' => - 'This configuration moved to Di configuration of \Magento\Framework\App\RequestInterface', + 'This configuration moved to DI configuration of \Magento\Framework\App\RequestInterface', '/config/global/secure_url' => - 'This configuration moved to Di configuration of \Magento\Framework\Url\SecurityInfo', + 'This configuration moved to DI configuration of \Magento\Framework\Url\SecurityInfo', '/config/global/dev' => - 'This configuration moved to Di configuration of \Magento\Framework\App\Action\Context', + 'This configuration moved to DI configuration of \Magento\Framework\App\Action\Context', '/config/global/webapi' => - 'This configuration moved to Di configuration of '. + 'This configuration moved to DI configuration of '. ' \Magento\Webapi\Controller\Request\Rest\Interpreter\Factory' . ' and \Magento\Webapi\Controller\Response\Rest\Renderer\Factory', '/config/global/cms' => - 'This configuration moved to Di configuration of \Magento\Cms\Model\Wysiwyg\Images\Storage' . + 'This configuration moved to DI configuration of \Magento\Cms\Model\Wysiwyg\Images\Storage' . ' and \Magento\Cms\Model\Wysiwyg\Config', '/config/global/widget' => - 'This configuration moved to Di configuration of \Magento\Cms\Model\Template\FilterProvider', + 'This configuration moved to DI configuration of \Magento\Cms\Model\Template\FilterProvider', '/config/global/catalog/product/flat/max_index_count' => - 'This configuration moved to Di configuration of '. + 'This configuration moved to DI configuration of '. '\Magento\Catalog\Model\ResourceModel\Product\Flat\Indexer', '/config/global/catalog/product/flat/attribute_groups' => - 'This configuration moved to Di configuration of '. + 'This configuration moved to DI configuration of '. '\Magento\Catalog\Model\ResourceModel\Product\Flat\Indexer', '/config/global/catalog/product/flat/add_filterable_attributes' => - 'This configuration moved to Di configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', + 'This configuration moved to DI configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', '/config/global/catalog/product/flat/add_child_data' => - 'This configuration moved to Di configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', + 'This configuration moved to DI configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', '/config/global/catalog/content/template_filter' => - 'This configuration moved to Di configuration of \Magento\Catalog\Helper\Data', + 'This configuration moved to DI configuration of \Magento\Catalog\Helper\Data', '/config/frontend/catalog/per_page_values/list' => - 'This configuration moved to Di configuration of \Magento\Catalog\Model\Config\Source\ListPerPage', + 'This configuration moved to DI configuration of \Magento\Catalog\Model\Config\Source\ListPerPage', '/config/frontend/catalog/per_page_values/grid' => - 'This configuration moved to Di configuration of \Magento\Catalog\Model\Config\Source\GridPerPage', - '/config/global/catalog/product/design' => 'This configuration moved to Di configuration of' . + 'This configuration moved to DI configuration of \Magento\Catalog\Model\Config\Source\GridPerPage', + '/config/global/catalog/product/design' => 'This configuration moved to DI configuration of' . ' \Magento\Catalog\Model\Entity\Product\Attribute\Design\Option\Container', '/config/global/catalog/product/attributes' => 'This configuration moved catalog_attributes.xml', '/config/global/eav_frontendclasses' => 'This configuration was removed. ' . 'Please pluginize \Magento\Eav\Helper\Data::getFrontendClasses to extend frontend classes list', '/config/global/resources' => - 'This configuration moved to Di configuration of \Magento\Framework\App\ResourceConnection', + 'This configuration moved to DI configuration of \Magento\Framework\App\ResourceConnection', '/config/global/resource' => - 'This configuration moved to Di configuration of \Magento\Framework\App\ResourceConnection', + 'This configuration moved to DI configuration of \Magento\Framework\App\ResourceConnection', '/config/*/events/core_block_abstract_to_html_after' => 'Event has been replaced with "core_layout_render_element"', '/config/*/events/catalog_controller_product_delete' => '', @@ -211,27 +308,29 @@ private function getObsoleteNodes(): array '/config/frontend/design' => 'Configurations moved to DI file settings', '/config/crontab' => 'All cron configurations moved to crontab.xml', '/config/global/areas' => 'Configurations moved to DI file settings', - '/config/vde' => 'Was moved to di', - '/config/global/ignoredModules' => 'Was replaced using di', - '/config/global/helpers' => 'Was replaced using di', - '/config/global/external_cache' => 'Was replaced using di', + '/config/vde' => 'Was moved to DI', + '/config/global/ignoredModules' => 'Was replaced using DI', + '/config/global/helpers' => 'Was replaced using DI', + '/config/global/external_cache' => 'Was replaced using DI', '/config/global/currency/import/services' => 'Configurations moved to DI file settings', '/config/global/template' => 'Use /config/template of email_templates.xml', '/config/default/general/file/sitemap_generate_valid_paths' => '/config/default/sitemap/file/valid_paths', - '/config/dev/css/minify_adapter' => 'Was replaced using di', - '/config/dev/js/minify_adapter' => 'Was replaced using di', + '/config/dev/css/minify_adapter' => 'Was replaced using DI', + '/config/dev/js/minify_adapter' => 'Was replaced using DI', '/config/global/full_page_cache' => '/config/global/cache_advanced/full_page', '/config/adminhtml/enterprise/admingws' => 'This configuration moved to admingws.xml file', '/config/adminhtml/enterprise/websiterestriction' => 'This configuration moved to websiterestrictions.xml file', '/config/global/enterprise_cms' => 'This configuration moved to menu_hierarchy.xml file', '/config/global/enterprise/banner' => - 'This configuration moved to Di configuration of \Magento\Banner\Model\Config', + 'This configuration moved to DI configuration of \Magento\Banner\Model\Config', '/config/global/enterprise/giftcardaccount' => - 'This configuration moved to Di configuration of \Magento\GiftCardAccountModelPool', - '/config/global/skip_process_modules_updates' => 'Was replaced using di', + 'This configuration moved to DI configuration of \Magento\GiftCardAccountModelPool', + '/config/global/skip_process_modules_updates' => 'Was replaced using DI', '/config/system/page_cache' => 'Module is eliminated. Use PageCache module instead', '/config/system/cms/content/versioning' => 'Functionality is eliminated', ]; } + + } diff --git a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php index a1425cab..a3372ff3 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php @@ -18,14 +18,14 @@ class ObsoleteConnectionSniff implements Sniff * @var string[] */ private $obsoleteMethods = [ - '_getReadConnection', - '_getWriteConnection', - '_getReadAdapter', - '_getWriteAdapter', - 'getReadConnection', - 'getWriteConnection', - 'getReadAdapter', - 'getWriteAdapter', + '_getReadConnection' => 'FoundObsoleteMethod_getReadConnection', + '_getWriteConnection' => 'FoundObsoleteMethod_getWriteConnection', + '_getReadAdapter' => 'FoundObsoleteMethod_getReadAdapter', + '_getWriteAdapter' => 'FoundObsoleteMethod_getWriteAdapter', + 'getReadConnection' => 'FoundObsoleteMethodGetReadConnection', + 'getWriteConnection' => 'FoundObsoleteMethodGetWriteConnection', + 'getReadAdapter' => 'FoundObsoleteMethodGetReadAdapter', + 'getWriteAdapter' => 'FoundObsoleteMethodGetWriteAdapter', ]; /** @@ -58,12 +58,12 @@ private function validateObsoleteMethod(File $phpcsFile, int $stackPtr) $tokens = $phpcsFile->getTokens(); $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); - foreach ($this->obsoleteMethods as $method) { + foreach ($this->obsoleteMethods as $method => $errorCode) { if ($tokens[$stringPos]['content'] === $method) { $phpcsFile->addWarning( sprintf("Contains obsolete method: %s. Please use getConnection method instead.", $method), $stackPtr, - self::ERROR_CODE_METHOD + $errorCode ); } } diff --git a/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php index 725a8b15..9dadee00 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php @@ -12,8 +12,6 @@ class ObsoleteResponseSniff implements Sniff { - private const WARNING_CODE_METHOD = 'FoundObsoleteResponseMethod'; - /** * @var string[] */ @@ -29,6 +27,22 @@ class ObsoleteResponseSniff implements Sniff '_addJs' => 'Please use \Magento\Backend\Model\View\Result\Page::addJs instead.', '_moveBlockToContainer' => 'Please use \Magento\Backend\Model\View\Result\Page::moveBlockToContainer instead.', ]; + + /** + * @var string[] + */ + private $obsoleteResponseWarningCodes = [ + 'loadLayout' => 'loadLayoutResponseMethodFound', + 'renderLayout' => 'renderLayoutResponseMethodFound', + '_redirect' => 'redirectResponseMethodFound', + '_forward' => 'forwardResponseMethodFound', + '_setActiveMenu' => 'setActiveMenuResponseMethodFound', + '_addBreadcrumb' => 'addBreadcrumbResponseMethodFound', + '_addContent' => 'addContentResponseMethodFound', + '_addLeft' => 'addLeftResponseMethodFound', + '_addJs' => 'addJsResponseMethodFound', + '_moveBlockToContainer' => 'moveBlockToContainerResponseMethodFound', + ]; /** * @inheritdoc @@ -54,7 +68,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addWarning( sprintf('%s method is deprecated. %s', $method, $errorMessage), $stackPtr, - self::WARNING_CODE_METHOD + $this->obsoleteResponseWarningCodes[$method] ); } } diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index 67d74575..cd9ef45e 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -13,6 +13,15 @@ class PhtmlTemplateSniff implements Sniff { private const WARNING_CODE = 'PhtmlTemplateObsolete'; + private const WARNING_CODE_TEXT_JAVASCRIPT = 'TextJavascriptTypeFound'; + private const WARNING_CODE_THIS_USAGE = 'ThisUsageObsolete'; + private const WARNING_CODE_PROTECTED_PRIVATE_BLOCK_ACCESS = 'ProtectedPrivateBlockAccess'; + + private const WARNING_CODES_OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ + '/(["\'])jquery\/ui\1/' => 'JQueryUILibraryFound', + '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'JSComponentInitInPHPFound', + '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'JSComponentInitInPHPFound', + ]; private const OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ '/(["\'])jquery\/ui\1/' => 'Please do not use "jquery/ui" library in templates. Use needed jquery ' . @@ -77,7 +86,7 @@ private function checkBlockVariable(File $phpcsFile, int $stackPtr, array $token 'Access to protected and private members of Block class is ' . 'obsolete in phtml templates. Use only public members.', $stringPos, - self::WARNING_CODE + self::WARNING_CODE_PROTECTED_PRIVATE_BLOCK_ACCESS ); } } @@ -101,7 +110,7 @@ private function checkThisVariable(File $phpcsFile, int $stackPtr, array $tokens 'Access to members and methods of Block class through $this is ' . 'obsolete in phtml templates. Use only $block instead of $this.', $stringPos, - self::WARNING_CODE + self::WARNING_CODE_THIS_USAGE ); } } @@ -120,7 +129,7 @@ private function checkHtml(File $phpcsFile, int $stackPtr): void $phpcsFile->addWarning( 'Please do not use "text/javascript" type attribute.', $stackPtr, - self::WARNING_CODE + self::WARNING_CODE_TEXT_JAVASCRIPT ); } } @@ -140,7 +149,7 @@ private function checkHtmlSpecificFiles(File $phpcsFile, int $stackPtr): void $phpcsFile->addWarning( $errorMessage, $stackPtr, - self::WARNING_CODE + self::WARNING_CODES_OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES[$obsoleteRegex] ); } } diff --git a/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php b/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php index 62ee2d4e..5b6c860c 100644 --- a/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php +++ b/Magento2/Sniffs/Legacy/RestrictedCodeSniff.php @@ -16,7 +16,6 @@ class RestrictedCodeSniff implements Sniff { private const ERROR_MESSAGE = "Class '%s' is restricted in %s. Suggested replacement: %s"; - private const ERROR_CODE = "restrictedClass"; /** * List of fixtures that contain restricted classes and should not be tested @@ -76,7 +75,7 @@ public function process(File $phpcsFile, $stackPtr) $this->classes[$token]['replacement'] ), $stackPtr, - self::ERROR_CODE, + $this->classes[$token]['warning_code'], ); } } diff --git a/Magento2/Sniffs/Legacy/WidgetXMLSniff.php b/Magento2/Sniffs/Legacy/WidgetXMLSniff.php index efd62aee..aee84dc8 100644 --- a/Magento2/Sniffs/Legacy/WidgetXMLSniff.php +++ b/Magento2/Sniffs/Legacy/WidgetXMLSniff.php @@ -15,7 +15,8 @@ */ class WidgetXMLSniff implements Sniff { - private const ERROR_CODE_OBSOLETE = 'FoundObsoleteNode'; + private const ERROR_CODE_OBSOLETE_SUPPORTED_BLOCKS = 'FoundObsoleteNodeSupportedBlocks'; + private const ERROR_CODE_OBSOLETE_BLOCK_NAME = 'FoundObsoleteNodeBlockName'; private const ERROR_CODE_FACTORY = 'FoundFactory'; private const ERROR_CODE_XML = 'WrongXML'; @@ -66,7 +67,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addError( "Obsolete node: . To be replaced with ", dom_import_simplexml($element)->getLineNo() - 1, - self::ERROR_CODE_OBSOLETE + self::ERROR_CODE_OBSOLETE_SUPPORTED_BLOCKS ); } @@ -75,7 +76,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addError( "Obsolete node: . To be replaced with ", dom_import_simplexml($element)->getLineNo() - 1, - self::ERROR_CODE_OBSOLETE + self::ERROR_CODE_OBSOLETE_BLOCK_NAME ); } } diff --git a/Magento2/Sniffs/Legacy/_files/restricted_classes.php b/Magento2/Sniffs/Legacy/_files/restricted_classes.php index 1052b994..41d4c698 100644 --- a/Magento2/Sniffs/Legacy/_files/restricted_classes.php +++ b/Magento2/Sniffs/Legacy/_files/restricted_classes.php @@ -13,6 +13,7 @@ */ return [ 'Zend_Db_Select' => [ + 'warning_code' => 'ZendDbSelectIsRestricted', 'replacement' => '\Magento\Framework\DB\Select', 'exclude' => [ 'Magento/Framework/DB/Select.php', @@ -22,12 +23,14 @@ ] ], 'Zend_Db_Adapter_Pdo_Mysql' => [ + 'warning_code' => 'ZendDbAdapterPdoMysqlIsRestricted', 'replacement' => '\Magento\Framework\DB\Adapter\Pdo\Mysql', 'exclude' => [ 'Magento/Framework/DB/Adapter/Pdo/Mysql.php' ] ], 'Magento\Framework\Serialize\Serializer\Serialize' => [ + 'warning_code' => 'SerializerSerializeIsRestricted', 'replacement' => 'Magento\Framework\Serialize\SerializerInterface', 'exclude' => [ 'Magento/Framework/App/ObjectManager/ConfigLoader/Compiled.php', @@ -56,6 +59,7 @@ ] ], 'ArrayObject' => [ + 'warning_code' => 'ArrayObjectIsRestricted', 'replacement' => 'Custom class, extended from ArrayObject with overwritten serialize/unserialize methods', 'exclude' => [ 'Magento/Theme/Model/Indexer/Design/Config.php', @@ -78,6 +82,7 @@ ] ], 'Magento\Framework\View\Element\UiComponent\ArrayObjectFactory' => [ + 'warning_code' => 'ArrayObjectFactoryIsRestricted', 'replacement' => 'Factory that creates custom class, extended from ArrayObject with overwritten ' . 'serialize/unserialize methods', 'exclude' => [ diff --git a/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php b/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php index 23724a7c..19b80e41 100644 --- a/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php +++ b/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php @@ -36,6 +36,44 @@ class ReservedWordsSniff implements Sniff 'numeric' => '7', ]; + /** + * @var string[] + */ + private $classErrorCodes = [ + 'int' => 'IntForbiddenAsClassName', + 'float' => 'FloatForbiddenAsClassName', + 'bool' => 'boolForbiddenAsClassName', + 'string' => 'stringForbiddenAsClassName', + 'true' => 'trueForbiddenAsClassName', + 'false' => 'falseForbiddenAsClassName', + 'null' => 'nullForbiddenAsClassName', + 'void' => 'voidForbiddenAsClassName', + 'iterable' => 'iterableForbiddenAsClassName', + 'resource' => 'resourceForbiddenAsClassName', + 'object' => 'objectForbiddenAsClassName', + 'mixed' => 'mixedForbiddenAsClassName', + 'numeric' => 'numericForbiddenAsClassName', + ]; + + /** + * @var string[] + */ + private $namespaceErrorCodes = [ + 'int' => 'IntForbiddenAsNameSpace', + 'float' => 'FloatForbiddenAsNameSpace', + 'bool' => 'boolForbiddenAsNameSpace', + 'string' => 'stringForbiddenAsNameSpace', + 'true' => 'trueForbiddenAsNameSpace', + 'false' => 'falseForbiddenAsNameSpace', + 'null' => 'nullForbiddenAsNameSpace', + 'void' => 'voidForbiddenAsNameSpace', + 'iterable' => 'iterableForbiddenAsNameSpace', + 'resource' => 'resourceForbiddenAsNameSpace', + 'object' => 'objectForbiddenAsNameSpace', + 'mixed' => 'mixedForbiddenAsNameSpace', + 'numeric' => 'numericForbiddenAsNameSpace', + ]; + /** * @inheritdoc */ @@ -65,7 +103,7 @@ protected function validateNamespace(File $sourceFile, $stackPtr) $sourceFile->addError( 'Cannot use "%s" in namespace as it is reserved since PHP %s', $stackPtr, - 'Namespace', + $this->namespaceErrorCodes[strtolower($namespacePart)], [$namespacePart, $this->reservedWords[strtolower($namespacePart)]] ); } @@ -89,7 +127,7 @@ protected function validateClass(File $sourceFile, $stackPtr) $sourceFile->addError( 'Cannot use "%s" as class name as it is reserved since PHP %s', $stackPtr, - 'Class', + $this->classErrorCodes[strtolower($className)], [$className, $this->reservedWords[$className]] ); } From c147628c9524bd8f8e20c993aec62b61eb032962 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 11:46:03 +0200 Subject: [PATCH 78/99] AC-1549: Fixed static tests --- Magento2/Sniffs/Legacy/DiConfigSniff.php | 3 +++ Magento2/Sniffs/Legacy/EmailTemplateSniff.php | 3 +++ Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php | 6 ++++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Magento2/Sniffs/Legacy/DiConfigSniff.php b/Magento2/Sniffs/Legacy/DiConfigSniff.php index 89c0025d..164a084c 100644 --- a/Magento2/Sniffs/Legacy/DiConfigSniff.php +++ b/Magento2/Sniffs/Legacy/DiConfigSniff.php @@ -11,6 +11,9 @@ class DiConfigSniff implements Sniff { + /** + * @var string[] + */ private $obsoleteDiNodesWarningCodes = [ ' 'FoundObsoleteParamNode', ' 'FoundObsoleteInstanceNode', diff --git a/Magento2/Sniffs/Legacy/EmailTemplateSniff.php b/Magento2/Sniffs/Legacy/EmailTemplateSniff.php index 1cff51fe..69cbc751 100644 --- a/Magento2/Sniffs/Legacy/EmailTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/EmailTemplateSniff.php @@ -19,6 +19,9 @@ class EmailTemplateSniff implements Sniff '/\{\{escapehtml.*?\}\}/i' => 'Directive {{escapehtml}} is obsolete. Use {{var}} instead.', ]; + /** + * @var string[] + */ private $errorCodes = [ '/\{\{htmlescape.*?\}\}/i' => 'FoundObsoleteHtmlescapeDirective', '/\{\{escapehtml.*?\}\}/i' => 'FoundObsoleteEscapehtmlDirective' diff --git a/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php index 9738d080..effaf123 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php @@ -15,6 +15,10 @@ class ObsoleteConfigNodesSniff implements Sniff { private const ERROR_MESSAGE_CONFIG = "Nodes identified by XPath '%s' are obsolete. %s"; private const ERROR_CODE_CONFIG = 'WrongXML'; + + /** + * @var string[] + */ private $obsoleteNodesErrorCodes = [ '/config/global/fieldsets' => 'obsoleteNodeGlobalFieldsets', '/config/global/cache/betatypes' => 'obsoleteNodeBetatypes', @@ -331,6 +335,4 @@ private function getObsoleteNodes(): array '/config/system/cms/content/versioning' => 'Functionality is eliminated', ]; } - - } From 94a395a84265063ef3348f5d9fee124d114b3eb4 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 13:04:55 +0200 Subject: [PATCH 79/99] AC-1549: Added more codes and cleaned up unused messages --- Magento2/Sniffs/Legacy/InstallUpgradeSniff.php | 12 +++++++++--- Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php | 2 -- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php index aad0e56b..e6c22cc4 100644 --- a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php +++ b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php @@ -13,8 +13,6 @@ class InstallUpgradeSniff implements Sniff { - private const ERROR_CODE = 'invalidDirectory'; - /** * @var string[] */ @@ -52,6 +50,14 @@ class InstallUpgradeSniff implements Sniff 'recurring' => 'obsoleteRecurringScript', ]; + /** + * @var string[] + */ + private $invalidDirectoriesErrorCodes = [ + 'data' => 'dataInvalidDirectory', + 'sql' => 'sqlInvalidDirectory' + ]; + /** * @inheritdoc */ @@ -88,7 +94,7 @@ public function process(File $phpcsFile, $stackPtr) . "- Create a data patch within module's Setup/Patch/Data folder for data upgrades.\n" . "- Use declarative schema approach in module's etc/db_schema.xml file for schema changes.", 0, - self::ERROR_CODE + $this->invalidDirectoriesErrorCodes[$folderName] ); } } diff --git a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php index a3372ff3..c79844a5 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php @@ -12,8 +12,6 @@ class ObsoleteConnectionSniff implements Sniff { - private const ERROR_CODE_METHOD = 'FoundObsoleteMethod'; - /** * @var string[] */ diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index cd9ef45e..e086adc5 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -12,7 +12,6 @@ class PhtmlTemplateSniff implements Sniff { - private const WARNING_CODE = 'PhtmlTemplateObsolete'; private const WARNING_CODE_TEXT_JAVASCRIPT = 'TextJavascriptTypeFound'; private const WARNING_CODE_THIS_USAGE = 'ThisUsageObsolete'; private const WARNING_CODE_PROTECTED_PRIVATE_BLOCK_ACCESS = 'ProtectedPrivateBlockAccess'; From f76f48f7d1750ff4b405b2ed8f0a8a3a20b9c5e9 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 14:54:46 +0200 Subject: [PATCH 80/99] Update Magento2/Sniffs/Legacy/InstallUpgradeSniff.php Co-authored-by: Sergii Ivashchenko --- Magento2/Sniffs/Legacy/InstallUpgradeSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php index e6c22cc4..d1e0c787 100644 --- a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php +++ b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php @@ -39,7 +39,7 @@ class InstallUpgradeSniff implements Sniff * @var string[] */ private $wrongPrefixesErrorCodes = [ - 'install-' => 'obsoleteInstallScript', + 'install-' => 'ObsoleteInstallScript', 'InstallSchema' => 'obsoleteInstallSchemaScript', 'InstallData' => 'obsoleteInstallDataScript', 'data-install-' => 'obsoleteDataInstallScript', From 395320787697e254fb376a2b6207a92c2c113613 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 14:54:53 +0200 Subject: [PATCH 81/99] Update Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php Co-authored-by: Sergii Ivashchenko --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index e086adc5..91de4672 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -18,7 +18,7 @@ class PhtmlTemplateSniff implements Sniff private const WARNING_CODES_OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ '/(["\'])jquery\/ui\1/' => 'JQueryUILibraryFound', - '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'JSComponentInitInPHPFound', + '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'FoundDataMageInit', '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'JSComponentInitInPHPFound', ]; From 28ce4efb524cbb9bfe35bd330f723d7692533cd5 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 14:54:58 +0200 Subject: [PATCH 82/99] Update Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php Co-authored-by: Sergii Ivashchenko --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index 91de4672..bb58f641 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -19,7 +19,7 @@ class PhtmlTemplateSniff implements Sniff private const WARNING_CODES_OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ '/(["\'])jquery\/ui\1/' => 'JQueryUILibraryFound', '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'FoundDataMageInit', - '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'JSComponentInitInPHPFound', + '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'FoundXMagentoInit', ]; private const OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ From d7c4374b4158c9f914b7f8685fa5e9d0bcd9c28d Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 14:55:03 +0200 Subject: [PATCH 83/99] Update Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php Co-authored-by: Sergii Ivashchenko --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index bb58f641..dd4d06d1 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -17,7 +17,7 @@ class PhtmlTemplateSniff implements Sniff private const WARNING_CODE_PROTECTED_PRIVATE_BLOCK_ACCESS = 'ProtectedPrivateBlockAccess'; private const WARNING_CODES_OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ - '/(["\'])jquery\/ui\1/' => 'JQueryUILibraryFound', + '/(["\'])jquery\/ui\1/' => 'FoundJQueryUI', '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'FoundDataMageInit', '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'FoundXMagentoInit', ]; From ee515c3e8acaf3b126f2afec57785e0ac973a96d Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 14:55:09 +0200 Subject: [PATCH 84/99] Update Magento2/Sniffs/Legacy/_files/restricted_classes.php Co-authored-by: Sergii Ivashchenko --- Magento2/Sniffs/Legacy/_files/restricted_classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/Legacy/_files/restricted_classes.php b/Magento2/Sniffs/Legacy/_files/restricted_classes.php index 41d4c698..ed6d2540 100644 --- a/Magento2/Sniffs/Legacy/_files/restricted_classes.php +++ b/Magento2/Sniffs/Legacy/_files/restricted_classes.php @@ -13,7 +13,7 @@ */ return [ 'Zend_Db_Select' => [ - 'warning_code' => 'ZendDbSelectIsRestricted', + 'warning_code' => 'ZendDbSelect', 'replacement' => '\Magento\Framework\DB\Select', 'exclude' => [ 'Magento/Framework/DB/Select.php', From 2391b0db6d2940289752ce060d7d1f633df32d99 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 16:51:59 +0200 Subject: [PATCH 85/99] AC-1549: Made suggestions --- Magento2/Sniffs/Legacy/DiConfigSniff.php | 49 ++--- Magento2/Sniffs/Legacy/EmailTemplateSniff.php | 26 ++- .../Sniffs/Legacy/InstallUpgradeSniff.php | 93 +++++---- .../Legacy/ObsoleteConfigNodesSniff.php | 179 ++++-------------- .../Sniffs/Legacy/ObsoleteResponseSniff.php | 20 +- .../NamingConvention/InterfaceNameSniff.php | 6 +- .../NamingConvention/ReservedWordsSniff.php | 55 +----- ...utogeneratedClassNotInConstructorSniff.php | 2 +- .../Sniffs/PHP/LiteralNamespacesSniff.php | 10 +- 9 files changed, 156 insertions(+), 284 deletions(-) diff --git a/Magento2/Sniffs/Legacy/DiConfigSniff.php b/Magento2/Sniffs/Legacy/DiConfigSniff.php index 164a084c..7495dd44 100644 --- a/Magento2/Sniffs/Legacy/DiConfigSniff.php +++ b/Magento2/Sniffs/Legacy/DiConfigSniff.php @@ -11,26 +11,27 @@ class DiConfigSniff implements Sniff { - /** - * @var string[] - */ - private $obsoleteDiNodesWarningCodes = [ - ' 'FoundObsoleteParamNode', - ' 'FoundObsoleteInstanceNode', - ' 'FoundObsoleteArrayNode', - ' 'FoundObsoleteValueNode', - ]; - - /** - * @var string[] Associative array containing the obsolete nodes and the message to display when they are found. - */ - private $obsoleteDiNodes = [ - ' 'The node is obsolete. Instead, use the ', - ' 'The node is obsolete. Instead, use the ', - ' 'The node is obsolete. Instead, use the ', - ' node is obsolete. Instead, use the ', - ' 'The node is obsolete. Instead, provide the actual value as a text literal.' + private const OBSOLETE_NODES = [ + 'FoundObsoleteParamNode' => [ + 'pattern' => ' 'The node is obsolete. Instead, use the ' + ], + 'FoundObsoleteInstanceNode' => [ + 'pattern' => ' 'The node is obsolete. Instead, use the >' + ], + 'FoundObsoleteArrayNode' => [ + 'pattern' => ' 'The node is obsolete. Instead, use the ' + ], + 'FoundObsoleteItemNode' => [ + 'pattern' => ' 'The node is obsolete. Instead, use the ' + ], + 'FoundObsoleteValueNode' => [ + 'pattern' => ' 'The node is obsolete. Instead, provide the actual value as a text literal' + ], ]; /** @@ -50,12 +51,12 @@ public function process(File $phpcsFile, $stackPtr) { $lineContent = $phpcsFile->getTokensAsString($stackPtr, 1); - foreach ($this->obsoleteDiNodes as $element => $message) { - if (strpos($lineContent, $element) !== false) { + foreach (self::OBSOLETE_NODES as $code => $data) { + if (strpos($lineContent, $data['pattern']) !== false) { $phpcsFile->addWarning( - $message, + $data['message'], $stackPtr, - $this->obsoleteDiNodesWarningCodes[$element] + $code ); } } diff --git a/Magento2/Sniffs/Legacy/EmailTemplateSniff.php b/Magento2/Sniffs/Legacy/EmailTemplateSniff.php index 69cbc751..85d6b9a0 100644 --- a/Magento2/Sniffs/Legacy/EmailTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/EmailTemplateSniff.php @@ -15,16 +15,14 @@ class EmailTemplateSniff implements Sniff { private const OBSOLETE_EMAIL_DIRECTIVES = [ - '/\{\{htmlescape.*?\}\}/i' => 'Directive {{htmlescape}} is obsolete. Use {{var}} instead.', - '/\{\{escapehtml.*?\}\}/i' => 'Directive {{escapehtml}} is obsolete. Use {{var}} instead.', - ]; - - /** - * @var string[] - */ - private $errorCodes = [ - '/\{\{htmlescape.*?\}\}/i' => 'FoundObsoleteHtmlescapeDirective', - '/\{\{escapehtml.*?\}\}/i' => 'FoundObsoleteEscapehtmlDirective' + 'FoundObsoleteHtmlescapeDirective' => [ + 'pattern' => '/\{\{htmlescape.*?\}\}/i', + 'message' => 'Directive {{htmlescape}} is obsolete. Use {{var}} instead.', + ], + 'FoundObsoleteEscapehtmlDirective' => [ + 'pattern' => '/\{\{escapehtml.*?\}\}/i', + 'message' => 'Directive {{escapehtml}} is obsolete. Use {{var}} instead.', + ], ]; /** @@ -43,12 +41,12 @@ public function register(): array public function process(File $phpcsFile, $stackPtr) { $content = $phpcsFile->getTokens()[$stackPtr]['content']; - foreach (self::OBSOLETE_EMAIL_DIRECTIVES as $directiveRegex => $errorMessage) { - if (preg_match($directiveRegex, $content)) { + foreach (self::OBSOLETE_EMAIL_DIRECTIVES as $code => $data) { + if (preg_match($data['pattern'], $content)) { $phpcsFile->addError( - $errorMessage, + $data['message'], $stackPtr, - $this->errorCodes[$directiveRegex] + $code ); } } diff --git a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php index d1e0c787..09dbedfb 100644 --- a/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php +++ b/Magento2/Sniffs/Legacy/InstallUpgradeSniff.php @@ -13,49 +13,58 @@ class InstallUpgradeSniff implements Sniff { - /** - * @var string[] - */ - private $wrongPrefixes = [ - 'install-' => 'Install scripts are obsolete. ' - . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', - 'InstallSchema' => 'InstallSchema scripts are obsolete. ' - . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', - 'InstallData' => 'InstallData scripts are obsolete. ' - . 'Please use data patches approach in module\'s Setup/Patch/Data dir', - 'data-install-' => 'Install scripts are obsolete. Please create class InstallData in module\'s Setup folder', - 'upgrade-' => 'Upgrade scripts are obsolete. ' - . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', - 'UpgradeSchema' => 'UpgradeSchema scripts are obsolete. ' - . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', - 'UpgradeData' => 'UpgradeData scripts are obsolete. ' - . 'Please use data patches approach in module\'s Setup/Patch/Data dir', - 'data-upgrade-' => 'Upgrade scripts are obsolete. ' - . 'Please use data patches approach in module\'s Setup/Patch/Data dir', - 'recurring' => 'Recurring scripts are obsolete. Please create class Recurring in module\'s Setup folder', - ]; - - /** - * @var string[] - */ - private $wrongPrefixesErrorCodes = [ - 'install-' => 'ObsoleteInstallScript', - 'InstallSchema' => 'obsoleteInstallSchemaScript', - 'InstallData' => 'obsoleteInstallDataScript', - 'data-install-' => 'obsoleteDataInstallScript', - 'upgrade-' => 'obsoleteUpgradeScript', - 'UpgradeSchema' => 'obsoleteUpgradeSchemaScript', - 'UpgradeData' => 'obsoleteUpgradeDataScript', - 'data-upgrade-' => 'obsoleteDataUpgradeScript', - 'recurring' => 'obsoleteRecurringScript', + private const WRONG_PREFIXES = [ + 'ObsoleteInstallScript' => [ + 'pattern' => 'install-', + 'message' => 'Install scripts are obsolete. ' + . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', + ], + 'ObsoleteInstallSchemaScript' => [ + 'pattern' => 'InstallSchema', + 'message' => 'InstallSchema scripts are obsolete. ' + . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', + ], + 'ObsoleteInstallDataScript' => [ + 'pattern' => 'InstallData', + 'message' => 'InstallData scripts are obsolete. ' + . 'Please use data patches approach in module\'s Setup/Patch/Data dir', + ], + 'ObsoleteDataInstallScript' => [ + 'pattern' => 'data-install-', + 'message' => 'Install scripts are obsolete. Please create class InstallData in module\'s Setup folder', + ], + 'ObsoleteUpgradeScript' => [ + 'pattern' => 'upgrade-', + 'message' => 'Upgrade scripts are obsolete. ' + . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', + ], + 'ObsoleteUpgradeSchemaScript' => [ + 'pattern' => 'UpgradeSchema', + 'message' => 'UpgradeSchema scripts are obsolete. ' + . 'Please use declarative schema approach in module\'s etc/db_schema.xml file', + ], + 'ObsoleteUpgradeDataScript' => [ + 'pattern' => 'UpgradeData', + 'message' => 'UpgradeData scripts are obsolete. ' + . 'Please use data patches approach in module\'s Setup/Patch/Data dir', + ], + 'ObsoleteDataUpgradeScript' => [ + 'pattern' => 'data-upgrade', + 'message' => 'Upgrade scripts are obsolete. ' + . 'Please use data patches approach in module\'s Setup/Patch/Data dir', + ], + 'ObsoleteRecurringScript' => [ + 'pattern' => 'recurring', + 'message' => 'Recurring scripts are obsolete. Please create class Recurring in module\'s Setup folder' + ] ]; /** * @var string[] */ - private $invalidDirectoriesErrorCodes = [ - 'data' => 'dataInvalidDirectory', - 'sql' => 'sqlInvalidDirectory' + private const INVALID_DIRECTORIES_ERROR_CODES = [ + 'data' => 'DataInvalidDirectory', + 'sql' => 'SqlInvalidDirectory' ]; /** @@ -79,9 +88,9 @@ public function process(File $phpcsFile, $stackPtr) $fileInfo = new SplFileInfo($phpcsFile->getFilename()); - foreach ($this->wrongPrefixes as $prefix => $errorMessage) { - if (strpos($fileInfo->getFilename(), $prefix) === 0) { - $phpcsFile->addError($errorMessage, 0, $this->wrongPrefixesErrorCodes[$prefix]); + foreach (self::WRONG_PREFIXES as $code => $data) { + if (strpos($fileInfo->getFilename(), $data['pattern']) === 0) { + $phpcsFile->addError($data['message'], 0, $code); } } @@ -94,7 +103,7 @@ public function process(File $phpcsFile, $stackPtr) . "- Create a data patch within module's Setup/Patch/Data folder for data upgrades.\n" . "- Use declarative schema approach in module's etc/db_schema.xml file for schema changes.", 0, - $this->invalidDirectoriesErrorCodes[$folderName] + self::INVALID_DIRECTORIES_ERROR_CODES[$folderName] ); } } diff --git a/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php index effaf123..efc5fae7 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConfigNodesSniff.php @@ -14,108 +14,7 @@ class ObsoleteConfigNodesSniff implements Sniff { private const ERROR_MESSAGE_CONFIG = "Nodes identified by XPath '%s' are obsolete. %s"; - private const ERROR_CODE_CONFIG = 'WrongXML'; - - /** - * @var string[] - */ - private $obsoleteNodesErrorCodes = [ - '/config/global/fieldsets' => 'obsoleteNodeGlobalFieldsets', - '/config/global/cache/betatypes' => 'obsoleteNodeBetatypes', - '/config/admin/fieldsets' => 'obsoleteNodeAdminFieldsets', - '/config/general/locale' => 'obsoleteNodeGeneralLocale', - '/config/global/can_use_base_url' => 'obsoleteNodeGlobalCanUseBaseURL', - '/config/global/locale/allow/codes' => 'obsoleteNodeAllowCodes', - '/config/global/locale/allow/currencies' => 'obsoleteNodeAllowCurrencies', - '/config/global/mime/types' => 'obsoleteNodeMimeTypes', - '/config/global/models/*/deprecatedNode' => 'obsoleteNodeDeprecatedNode', - '/config/global/models/*/entities/*/table' => 'obsoleteNodeEntitiesTable', - '/config/global/models/*/class' => 'obsoleteNodeModelsClass', - '/config/global/helpers/*/class' => 'obsoleteNodeHelpersClass', - '/config/global/blocks/*/class' => 'obsoleteNodeBlocksClass', - '/config/global/models/*/resourceModel' => 'obsoleteNodeResourceModel', - '/config/global/page/layouts' => 'obsoleteNodePageLayouts', - '/config/global/cms/layouts' => 'obsoleteNodeCmsLayouts', - '/config/global/payment/cc/types/*/validator' => 'obsoleteNodeTypesValidator', - '/config/global/payment' => 'obsoleteNodeGlobalPayment', - '/config/adminhtml/menu' => 'obsoleteNodeAdminhtmlMenu', - '/config/adminhtml/acl' => 'obsoleteNodeAdminhtmlAcl', - '/config/adminhtml/global_search' => 'obsoleteNodeAdminhtmlGlobalSearch', - '/config/*[self::global|self::adminhtml|self::frontend]/di' => 'obsoleteNodeDi', - '/config/*[self::global|self::adminhtml|self::frontend]/events' => 'obsoleteNodeEvents', - '/config/*[self::global|self::adminhtml|self::frontend]/routers' => 'obsoleteNodeRouters', - '/config/global/importexport' => 'obsoleteNodeGlobalImportExport', - '/config/global/catalog/product/type' => 'obsoleteNodeProductType', - '/config/global/catalog/product/options' => 'obsoleteNodeProductOptions', - '/config/global/catalog/product/media/image_types' => 'obsoleteNodeMediaImageTypes', - '/config/global/eav_attributes' => 'obsoleteNodeEavAttributes', - '/config/global/index' => 'obsoleteNodeGlobalIndex', - '/config/global/catalogrule' => 'obsoleteNodeGlobalCatalogRule', - '/config/global/salesrule' => 'obsoleteNodeGlobalSalesRule', - '/config/global/session' => 'obsoleteNodeGlobalSession', - '/config/global/ignore_user_agents' => 'obsoleteNodeGlobalIgnoreUserAgents', - '/config/global/request' => 'obsoleteNodeGlobalRequest', - '/config/global/secure_url' => 'obsoleteNodeGlobalSecureUrl', - '/config/global/dev' => 'obsoleteNodeGlobalDev', - '/config/global/webapi' => 'obsoleteNodeGlobalWebapi', - '/config/global/cms' => 'obsoleteNodeGlobalCms', - '/config/global/widget' => 'obsoleteNodeGlobalWidget', - '/config/global/catalog/product/flat/max_index_count' => 'obsoleteNodeFlatMaxIndexCount', - '/config/global/catalog/product/flat/attribute_groups' => 'obsoleteNodeFlatAttributeGroups', - '/config/global/catalog/product/flat/add_filterable_attributes' => 'obsoleteNodeFlatAddIterableAttributes', - '/config/global/catalog/product/flat/add_child_data' => 'obsoleteNodeFlatAddChildData', - '/config/global/catalog/content/template_filter' => 'obsoleteNodeContentTemplateFilter', - '/config/frontend/catalog/per_page_values/list' => 'obsoleteNodePerPageValuesList', - '/config/frontend/catalog/per_page_values/grid' => 'obsoleteNodePerPageValuesGrid', - '/config/global/catalog/product/design' => 'obsoleteNodeProductDesign', - '/config/global/catalog/product/attributes' => 'obsoleteNodeProductAttributes', - '/config/global/eav_frontendclasses' => 'obsoleteNodeGlobalEavFrontendClasses', - '/config/global/resources' => 'obsoleteNodeGlobalResources', - '/config/global/resource' => 'obsoleteNodeGlobalResource', - '/config/*/events/core_block_abstract_to_html_after' => 'obsoleteNodeEventsCoreBlockAbstract', - '/config/*/events/catalog_controller_product_delete' => 'obsoleteNodeEventsCatalogController', - '/config//observers/*/args' => 'obsoleteNodeObserversArgs', - '/config/default/design/theme' => 'obsoleteNodeDesignTheme', - '/config/global/theme' => 'obsoleteNodeGlobalTheme', - '/config/default/web/*/base_js_url' => 'obsoleteNodeWebBaseJsUrl', - '/config/default/web/*/base_skin_url' => 'obsoleteNodeWebBaseSkinUrl', - '/config/default/web/*/base_cache_url' => 'obsoleteNodeWebBaseCacheUrl', - '/config/global/cache/types/*/tags' => 'obsoleteNodeTypesTags', - '/config/global/disable_local_modules' => 'obsoleteNodeGlobalDisableLocalModules', - '/config/global/newsletter/template_filter' => 'obsoleteNodeNewsletterTemplateFilter', - '/config/*/layout' => 'obsoleteNodeConfigLayout', - '/config/frontend/product/collection/attributes' => 'obsoleteNodeProductCollectionAttributes', - '/config/frontend/category/collection/attributes' => 'obsoleteNodeCategoryCollectionAttributes', - '/config/global/sales/quote/item/product_attributes' => 'obsoleteNodeQuoteItemProductAttributes', - '/config/global/wishlist/item/product_attributes' => 'obsoleteNodeWishlistItemProductAttributes', - '/config/global/catalog/product/flat/attribute_nodes' => 'obsoleteNodeFlatAttributeNodes', - '/config/global/customer/address/formats' => 'obsoleteNodeCustomerAddressFormats', - '/config/global/pdf' => 'obsoleteNodeGlobalPdf', - '/config/install' => 'obsoleteNodeConfigInstall', - '/config/install/design' => 'obsoleteNodeConfigInstallDesign', - '/config/adminhtml/design' => 'obsoleteNodeConfigAdminhtmlDesign', - '/config/frontend/design' => 'obsoleteNodeConfigFrontendDesign', - '/config/crontab' => 'obsoleteNodeConfigCrontab', - '/config/global/areas' => 'obsoleteNodeGlobalAreas', - '/config/vde' => 'obsoleteNodeConfigVde', - '/config/global/ignoredModules' => 'obsoleteNodeGlobalIgnoredModules', - '/config/global/helpers' => 'obsoleteNodeGlobalHelpers', - '/config/global/external_cache' => 'obsoleteNodeGlobalExternalCache', - '/config/global/currency/import/services' => 'obsoleteNodeCurrencyImportServices', - '/config/global/template' => 'obsoleteNodeGlobalTemplate', - '/config/default/general/file/sitemap_generate_valid_paths' => 'obsoleteNodeFileSitemap', - '/config/dev/css/minify_adapter' => 'obsoleteNodeCssMinify', - '/config/dev/js/minify_adapter' => 'obsoleteNodeJsMinify', - '/config/global/full_page_cache' => 'obsoleteNodeGlobalFullPageCache', - '/config/adminhtml/enterprise/admingws' => 'obsoleteNodeEnterpriseAdmingws', - '/config/adminhtml/enterprise/websiterestriction' => 'obsoleteNodeEnterpriseWebsiteRestriction', - '/config/global/enterprise_cms' => 'obsoleteNodeGlobalEnterpriseCms', - '/config/global/enterprise/banner' => 'obsoleteNodeGlobalEnterpriseBanner', - '/config/global/enterprise/giftcardaccount' => 'obsoleteNodeGlobalEnterpriseGiftCardAccount', - '/config/global/skip_process_modules_updates' => 'obsoleteNodeGlobalSkipProcess', - '/config/system/page_cache' => 'obsoleteNodeSystemPageCache', - '/config/system/cms/content/versioning' => 'obsoleteNodeContentVersioning', - ]; + private const ERROR_CODE_CONFIG = 'ObsoleteNodeInConfig'; /** * @inheritdoc @@ -164,7 +63,7 @@ public function process(File $phpcsFile, $stackPtr) $suggestion ), dom_import_simplexml($match)->getLineNo()-1, - $this->obsoleteNodesErrorCodes[$xpath] + self::ERROR_CODE_CONFIG ); } } @@ -196,15 +95,15 @@ private function getObsoleteNodes(): array '/config/global/cache/betatypes' => '', '/config/admin/fieldsets' => '', '/config/general/locale' => - 'This configuration moved to DI configuration of \Magento\Framework\Locale\ConfigInterface', + 'This configuration moved to Di configuration of \Magento\Framework\Locale\ConfigInterface', '/config/global/can_use_base_url' => - 'This configuration moved to DI configuration of \Magento\Backend\App\Action\Context class', + 'This configuration moved to Di configuration of \Magento\Backend\App\Action\Context class', '/config/global/locale/allow/codes' => - 'This configuration moved to DI configuration of \Magento\Framework\Locale\ConfigInterface', + 'This configuration moved to Di configuration of \Magento\Framework\Locale\ConfigInterface', '/config/global/locale/allow/currencies' => - 'This configuration moved to DI configuration of \Magento\Framework\Locale\ConfigInterface', + 'This configuration moved to Di configuration of \Magento\Framework\Locale\ConfigInterface', '/config/global/mime/types' => - 'This configuration moved to DI configuration for \Magento\Downloadable\Helper\File class', + 'This configuration moved to Di configuration for \Magento\Downloadable\Helper\File class', '/config/global/models/*/deprecatedNode' => '', '/config/global/models/*/entities/*/table' => '', '/config/global/models/*/class' => '', @@ -219,68 +118,68 @@ private function getObsoleteNodes(): array '/config/adminhtml/menu' => 'Move them to adminhtml.xml.', '/config/adminhtml/acl' => 'Move them to adminhtml.xml.', '/config/adminhtml/global_search' => - 'This configuration moved to DI configuration of \Magento\Backend\Controller\Index', + 'This configuration moved to Di configuration of \Magento\Backend\Controller\Index', '/config/*[self::global|self::adminhtml|self::frontend]/di' => 'This configuration moved to di.xml file', '/config/*[self::global|self::adminhtml|self::frontend]/events' => 'This configuration moved to events.xml file', '/config/*[self::global|self::adminhtml|self::frontend]/routers' => 'Routes configuration moved to routes.xml file,' . - 'routers list can be set through DI configuration of \Magento\Framework\App\RouterList model', + 'routers list can be set through Di configuration of \Magento\Framework\App\RouterList model', '/config/global/importexport' => 'This configuration moved to import.xml and export.xml files', '/config/global/catalog/product/type' => 'This configuration moved to product_types.xml file', '/config/global/catalog/product/options' => 'This configuration moved to product_options.xml file', - '/config/global/catalog/product/media/image_types' => 'This configuration moved to DI configuration of ' . + '/config/global/catalog/product/media/image_types' => 'This configuration moved to Di configuration of ' . '\Magento\Backend\Block\Catalog\Product\Frontend\Product\Watermark', '/config/global/eav_attributes' => 'This configuration moved to eav_attributes.xml file', '/config/global/index' => 'This configuration moved to indexers.xml file', '/config/global/catalogrule' => - 'This configuration moved to DI configuration of \Magento\CatalogRule\Model\Rule', + 'This configuration moved to Di configuration of \Magento\CatalogRule\Model\Rule', '/config/global/salesrule' => - 'This configuration moved to DI configuration of \Magento\SalesRule\Helper\Coupon', + 'This configuration moved to Di configuration of \Magento\SalesRule\Helper\Coupon', '/config/global/session' => - 'This configuration moved to DI configuration of \Magento\Framework\Session\Validator', + 'This configuration moved to Di configuration of \Magento\Framework\Session\Validator', '/config/global/ignore_user_agents' => - 'This configuration moved to DI configuration of \Magento\Log\Model\Visitor', + 'This configuration moved to Di configuration of \Magento\Log\Model\Visitor', '/config/global/request' => - 'This configuration moved to DI configuration of \Magento\Framework\App\RequestInterface', + 'This configuration moved to Di configuration of \Magento\Framework\App\RequestInterface', '/config/global/secure_url' => - 'This configuration moved to DI configuration of \Magento\Framework\Url\SecurityInfo', + 'This configuration moved to Di configuration of \Magento\Framework\Url\SecurityInfo', '/config/global/dev' => - 'This configuration moved to DI configuration of \Magento\Framework\App\Action\Context', + 'This configuration moved to Di configuration of \Magento\Framework\App\Action\Context', '/config/global/webapi' => - 'This configuration moved to DI configuration of '. + 'This configuration moved to Di configuration of '. ' \Magento\Webapi\Controller\Request\Rest\Interpreter\Factory' . ' and \Magento\Webapi\Controller\Response\Rest\Renderer\Factory', '/config/global/cms' => - 'This configuration moved to DI configuration of \Magento\Cms\Model\Wysiwyg\Images\Storage' . + 'This configuration moved to Di configuration of \Magento\Cms\Model\Wysiwyg\Images\Storage' . ' and \Magento\Cms\Model\Wysiwyg\Config', '/config/global/widget' => - 'This configuration moved to DI configuration of \Magento\Cms\Model\Template\FilterProvider', + 'This configuration moved to Di configuration of \Magento\Cms\Model\Template\FilterProvider', '/config/global/catalog/product/flat/max_index_count' => - 'This configuration moved to DI configuration of '. + 'This configuration moved to Di configuration of '. '\Magento\Catalog\Model\ResourceModel\Product\Flat\Indexer', '/config/global/catalog/product/flat/attribute_groups' => - 'This configuration moved to DI configuration of '. + 'This configuration moved to Di configuration of '. '\Magento\Catalog\Model\ResourceModel\Product\Flat\Indexer', '/config/global/catalog/product/flat/add_filterable_attributes' => - 'This configuration moved to DI configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', + 'This configuration moved to Di configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', '/config/global/catalog/product/flat/add_child_data' => - 'This configuration moved to DI configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', + 'This configuration moved to Di configuration of \Magento\Catalog\Helper\Product\Flat\Indexer', '/config/global/catalog/content/template_filter' => - 'This configuration moved to DI configuration of \Magento\Catalog\Helper\Data', + 'This configuration moved to Di configuration of \Magento\Catalog\Helper\Data', '/config/frontend/catalog/per_page_values/list' => - 'This configuration moved to DI configuration of \Magento\Catalog\Model\Config\Source\ListPerPage', + 'This configuration moved to Di configuration of \Magento\Catalog\Model\Config\Source\ListPerPage', '/config/frontend/catalog/per_page_values/grid' => - 'This configuration moved to DI configuration of \Magento\Catalog\Model\Config\Source\GridPerPage', - '/config/global/catalog/product/design' => 'This configuration moved to DI configuration of' . + 'This configuration moved to Di configuration of \Magento\Catalog\Model\Config\Source\GridPerPage', + '/config/global/catalog/product/design' => 'This configuration moved to Di configuration of' . ' \Magento\Catalog\Model\Entity\Product\Attribute\Design\Option\Container', '/config/global/catalog/product/attributes' => 'This configuration moved catalog_attributes.xml', '/config/global/eav_frontendclasses' => 'This configuration was removed. ' . 'Please pluginize \Magento\Eav\Helper\Data::getFrontendClasses to extend frontend classes list', '/config/global/resources' => - 'This configuration moved to DI configuration of \Magento\Framework\App\ResourceConnection', + 'This configuration moved to Di configuration of \Magento\Framework\App\ResourceConnection', '/config/global/resource' => - 'This configuration moved to DI configuration of \Magento\Framework\App\ResourceConnection', + 'This configuration moved to Di configuration of \Magento\Framework\App\ResourceConnection', '/config/*/events/core_block_abstract_to_html_after' => 'Event has been replaced with "core_layout_render_element"', '/config/*/events/catalog_controller_product_delete' => '', @@ -312,25 +211,25 @@ private function getObsoleteNodes(): array '/config/frontend/design' => 'Configurations moved to DI file settings', '/config/crontab' => 'All cron configurations moved to crontab.xml', '/config/global/areas' => 'Configurations moved to DI file settings', - '/config/vde' => 'Was moved to DI', - '/config/global/ignoredModules' => 'Was replaced using DI', - '/config/global/helpers' => 'Was replaced using DI', - '/config/global/external_cache' => 'Was replaced using DI', + '/config/vde' => 'Was moved to di', + '/config/global/ignoredModules' => 'Was replaced using di', + '/config/global/helpers' => 'Was replaced using di', + '/config/global/external_cache' => 'Was replaced using di', '/config/global/currency/import/services' => 'Configurations moved to DI file settings', '/config/global/template' => 'Use /config/template of email_templates.xml', '/config/default/general/file/sitemap_generate_valid_paths' => '/config/default/sitemap/file/valid_paths', - '/config/dev/css/minify_adapter' => 'Was replaced using DI', - '/config/dev/js/minify_adapter' => 'Was replaced using DI', + '/config/dev/css/minify_adapter' => 'Was replaced using di', + '/config/dev/js/minify_adapter' => 'Was replaced using di', '/config/global/full_page_cache' => '/config/global/cache_advanced/full_page', '/config/adminhtml/enterprise/admingws' => 'This configuration moved to admingws.xml file', '/config/adminhtml/enterprise/websiterestriction' => 'This configuration moved to websiterestrictions.xml file', '/config/global/enterprise_cms' => 'This configuration moved to menu_hierarchy.xml file', '/config/global/enterprise/banner' => - 'This configuration moved to DI configuration of \Magento\Banner\Model\Config', + 'This configuration moved to Di configuration of \Magento\Banner\Model\Config', '/config/global/enterprise/giftcardaccount' => - 'This configuration moved to DI configuration of \Magento\GiftCardAccountModelPool', - '/config/global/skip_process_modules_updates' => 'Was replaced using DI', + 'This configuration moved to Di configuration of \Magento\GiftCardAccountModelPool', + '/config/global/skip_process_modules_updates' => 'Was replaced using di', '/config/system/page_cache' => 'Module is eliminated. Use PageCache module instead', '/config/system/cms/content/versioning' => 'Functionality is eliminated', ]; diff --git a/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php index 9dadee00..765ae5f1 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteResponseSniff.php @@ -32,16 +32,16 @@ class ObsoleteResponseSniff implements Sniff * @var string[] */ private $obsoleteResponseWarningCodes = [ - 'loadLayout' => 'loadLayoutResponseMethodFound', - 'renderLayout' => 'renderLayoutResponseMethodFound', - '_redirect' => 'redirectResponseMethodFound', - '_forward' => 'forwardResponseMethodFound', - '_setActiveMenu' => 'setActiveMenuResponseMethodFound', - '_addBreadcrumb' => 'addBreadcrumbResponseMethodFound', - '_addContent' => 'addContentResponseMethodFound', - '_addLeft' => 'addLeftResponseMethodFound', - '_addJs' => 'addJsResponseMethodFound', - '_moveBlockToContainer' => 'moveBlockToContainerResponseMethodFound', + 'loadLayout' => 'LoadLayoutResponseMethodFound', + 'renderLayout' => 'RenderLayoutResponseMethodFound', + '_redirect' => 'RedirectResponseMethodFound', + '_forward' => 'ForwardResponseMethodFound', + '_setActiveMenu' => 'SetActiveMenuResponseMethodFound', + '_addBreadcrumb' => 'AddBreadcrumbResponseMethodFound', + '_addContent' => 'AddContentResponseMethodFound', + '_addLeft' => 'AddLeftResponseMethodFound', + '_addJs' => 'AddJsResponseMethodFound', + '_moveBlockToContainer' => 'MoveBlockToContainerResponseMethodFound', ]; /** diff --git a/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php b/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php index 2ad688ec..8daf5226 100644 --- a/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php +++ b/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php @@ -45,16 +45,16 @@ public function register() /** * @inheritdoc */ - public function process(File $sourceFile, $stackPtr) + public function process(File $phpcsFile, $stackPtr) { - $tokens = $sourceFile->getTokens(); + $tokens = $phpcsFile->getTokens(); $declarationLine = $tokens[$stackPtr]['line']; $suffixLength = strlen($this->interfaceSuffix); // Find first T_STRING after 'interface' keyword in the line and verify it while ($tokens[$stackPtr]['line'] === $declarationLine) { if ($tokens[$stackPtr]['type'] === 'T_STRING') { if (substr($tokens[$stackPtr]['content'], 0 - $suffixLength) !== $this->interfaceSuffix) { - $sourceFile->addWarning($this->warningMessage, $stackPtr, $this->warningCode); + $phpcsFile->addWarning($this->warningMessage, $stackPtr, $this->warningCode); } break; } diff --git a/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php b/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php index 19b80e41..13109c58 100644 --- a/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php +++ b/Magento2/Sniffs/NamingConvention/ReservedWordsSniff.php @@ -36,43 +36,8 @@ class ReservedWordsSniff implements Sniff 'numeric' => '7', ]; - /** - * @var string[] - */ - private $classErrorCodes = [ - 'int' => 'IntForbiddenAsClassName', - 'float' => 'FloatForbiddenAsClassName', - 'bool' => 'boolForbiddenAsClassName', - 'string' => 'stringForbiddenAsClassName', - 'true' => 'trueForbiddenAsClassName', - 'false' => 'falseForbiddenAsClassName', - 'null' => 'nullForbiddenAsClassName', - 'void' => 'voidForbiddenAsClassName', - 'iterable' => 'iterableForbiddenAsClassName', - 'resource' => 'resourceForbiddenAsClassName', - 'object' => 'objectForbiddenAsClassName', - 'mixed' => 'mixedForbiddenAsClassName', - 'numeric' => 'numericForbiddenAsClassName', - ]; - - /** - * @var string[] - */ - private $namespaceErrorCodes = [ - 'int' => 'IntForbiddenAsNameSpace', - 'float' => 'FloatForbiddenAsNameSpace', - 'bool' => 'boolForbiddenAsNameSpace', - 'string' => 'stringForbiddenAsNameSpace', - 'true' => 'trueForbiddenAsNameSpace', - 'false' => 'falseForbiddenAsNameSpace', - 'null' => 'nullForbiddenAsNameSpace', - 'void' => 'voidForbiddenAsNameSpace', - 'iterable' => 'iterableForbiddenAsNameSpace', - 'resource' => 'resourceForbiddenAsNameSpace', - 'object' => 'objectForbiddenAsNameSpace', - 'mixed' => 'mixedForbiddenAsNameSpace', - 'numeric' => 'numericForbiddenAsNameSpace', - ]; + private const CLASS_ERROR_CODE = 'ForbiddenAsClassName'; + private const NAMESPACE_ERROR_CODE = 'ForbiddenAsNameSpace'; /** * @inheritdoc @@ -89,7 +54,7 @@ public function register() * @param int $stackPtr * @return void */ - protected function validateNamespace(File $sourceFile, $stackPtr) + protected function validateNamespace(File $sourceFile, int $stackPtr) { $stackPtr += 2; $tokens = $sourceFile->getTokens(); @@ -103,7 +68,7 @@ protected function validateNamespace(File $sourceFile, $stackPtr) $sourceFile->addError( 'Cannot use "%s" in namespace as it is reserved since PHP %s', $stackPtr, - $this->namespaceErrorCodes[strtolower($namespacePart)], + self::NAMESPACE_ERROR_CODE, [$namespacePart, $this->reservedWords[strtolower($namespacePart)]] ); } @@ -118,7 +83,7 @@ protected function validateNamespace(File $sourceFile, $stackPtr) * @param int $stackPtr * @return void */ - protected function validateClass(File $sourceFile, $stackPtr) + protected function validateClass(File $sourceFile, int $stackPtr) { $tokens = $sourceFile->getTokens(); $stackPtr += 2; //skip "class" and whitespace @@ -127,7 +92,7 @@ protected function validateClass(File $sourceFile, $stackPtr) $sourceFile->addError( 'Cannot use "%s" as class name as it is reserved since PHP %s', $stackPtr, - $this->classErrorCodes[strtolower($className)], + self::CLASS_ERROR_CODE, [$className, $this->reservedWords[$className]] ); } @@ -136,17 +101,17 @@ protected function validateClass(File $sourceFile, $stackPtr) /** * @inheritdoc */ - public function process(File $sourceFile, $stackPtr) + public function process(File $phpcsFile, $stackPtr) { - $tokens = $sourceFile->getTokens(); + $tokens = $phpcsFile->getTokens(); switch ($tokens[$stackPtr]['code']) { case T_CLASS: case T_INTERFACE: case T_TRAIT: - $this->validateClass($sourceFile, $stackPtr); + $this->validateClass($phpcsFile, $stackPtr); break; case T_NAMESPACE: - $this->validateNamespace($sourceFile, $stackPtr); + $this->validateNamespace($phpcsFile, $stackPtr); break; } } diff --git a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php index f99346af..6c56d07e 100644 --- a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php +++ b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php @@ -15,7 +15,7 @@ */ class AutogeneratedClassNotInConstructorSniff implements Sniff { - private const ERROR_CODE = 'AUTOGENERATED_CLASS_NOT_IN_CONSTRUCTOR'; + private const ERROR_CODE = 'AutogeneratedClassNotInConstructor'; /** * @var array diff --git a/Magento2/Sniffs/PHP/LiteralNamespacesSniff.php b/Magento2/Sniffs/PHP/LiteralNamespacesSniff.php index 705e154b..d76dae3e 100644 --- a/Magento2/Sniffs/PHP/LiteralNamespacesSniff.php +++ b/Magento2/Sniffs/PHP/LiteralNamespacesSniff.php @@ -37,11 +37,11 @@ public function register() /** * @inheritdoc */ - public function process(File $sourceFile, $stackPtr) + public function process(File $phpcsFile, $stackPtr) { - $tokens = $sourceFile->getTokens(); - if ($sourceFile->findPrevious(T_STRING_CONCAT, $stackPtr, $stackPtr - 3) || - $sourceFile->findNext(T_STRING_CONCAT, $stackPtr, $stackPtr + 3) + $tokens = $phpcsFile->getTokens(); + if ($phpcsFile->findPrevious(T_STRING_CONCAT, $stackPtr, $stackPtr - 3) || + $phpcsFile->findNext(T_STRING_CONCAT, $stackPtr, $stackPtr + 3) ) { return; } @@ -53,7 +53,7 @@ public function process(File $sourceFile, $stackPtr) } if (preg_match($this->literalNamespacePattern, $content) === 1) { - $sourceFile->addWarning( + $phpcsFile->addWarning( "Use ::class notation instead.", $stackPtr, 'LiteralClassUsage' From 852a479d8a4ba28fe21d718672dee5934119ec2b Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 17:11:00 +0200 Subject: [PATCH 86/99] AC-1549: Made suggestions --- .../Sniffs/Legacy/ObsoleteConnectionSniff.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php index c79844a5..74a74394 100644 --- a/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php +++ b/Magento2/Sniffs/Legacy/ObsoleteConnectionSniff.php @@ -16,16 +16,18 @@ class ObsoleteConnectionSniff implements Sniff * @var string[] */ private $obsoleteMethods = [ - '_getReadConnection' => 'FoundObsoleteMethod_getReadConnection', - '_getWriteConnection' => 'FoundObsoleteMethod_getWriteConnection', - '_getReadAdapter' => 'FoundObsoleteMethod_getReadAdapter', - '_getWriteAdapter' => 'FoundObsoleteMethod_getWriteAdapter', - 'getReadConnection' => 'FoundObsoleteMethodGetReadConnection', - 'getWriteConnection' => 'FoundObsoleteMethodGetWriteConnection', - 'getReadAdapter' => 'FoundObsoleteMethodGetReadAdapter', - 'getWriteAdapter' => 'FoundObsoleteMethodGetWriteAdapter', + '_getReadConnection', + '_getWriteConnection', + '_getReadAdapter', + '_getWriteAdapter', + 'getReadConnection', + 'getWriteConnection', + 'getReadAdapter', + 'getWriteAdapter', ]; + private const OBSOLETE_METHOD_ERROR_CODE = 'ObsoleteMethodFound'; + /** * @inheritdoc */ @@ -56,12 +58,12 @@ private function validateObsoleteMethod(File $phpcsFile, int $stackPtr) $tokens = $phpcsFile->getTokens(); $stringPos = $phpcsFile->findNext(T_STRING, $stackPtr + 1); - foreach ($this->obsoleteMethods as $method => $errorCode) { + foreach ($this->obsoleteMethods as $method) { if ($tokens[$stringPos]['content'] === $method) { $phpcsFile->addWarning( sprintf("Contains obsolete method: %s. Please use getConnection method instead.", $method), $stackPtr, - $errorCode + self::OBSOLETE_METHOD_ERROR_CODE ); } } From 3d3dc9e54ba206b7272acecb73883a1fdea52da5 Mon Sep 17 00:00:00 2001 From: Sergio Vera Date: Tue, 26 Oct 2021 17:17:22 +0200 Subject: [PATCH 87/99] AC-1549: Made suggestions --- Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php index dd4d06d1..4217ecda 100644 --- a/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php +++ b/Magento2/Sniffs/Legacy/PhtmlTemplateSniff.php @@ -16,19 +16,19 @@ class PhtmlTemplateSniff implements Sniff private const WARNING_CODE_THIS_USAGE = 'ThisUsageObsolete'; private const WARNING_CODE_PROTECTED_PRIVATE_BLOCK_ACCESS = 'ProtectedPrivateBlockAccess'; - private const WARNING_CODES_OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ - '/(["\'])jquery\/ui\1/' => 'FoundJQueryUI', - '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'FoundDataMageInit', - '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'FoundXMagentoInit', - ]; - - private const OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES = [ - '/(["\'])jquery\/ui\1/' => 'Please do not use "jquery/ui" library in templates. Use needed jquery ' . - 'ui widget instead.', - '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/' => 'Please do not initialize JS component in php. Do ' . - 'it in template.', - '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i' => 'Please do not initialize JS component ' . - 'in php. Do it in template.', + private const OBSOLETE_REGEX = [ + 'FoundJQueryUI' => [ + 'pattern' => '/(["\'])jquery\/ui\1/', + 'message' => 'Please do not use "jquery/ui" library in templates. Use needed jquery ui widget instead' + ], + 'FoundDataMageInit' => [ + 'pattern' => '/data-mage-init=(?:\'|")(?!\s*{\s*"[^"]+")/', + 'message' => 'Please do not initialize JS component in php. Do it in template' + ], + 'FoundXMagentoInit' => [ + 'pattern' => '@x-magento-init.>(?!\s*+{\s*"[^"]+"\s*:\s*{\s*"[\w/-]+")@i', + 'message' => 'Please do not initialize JS component in php. Do it in template' + ], ]; /** @@ -143,12 +143,12 @@ private function checkHtmlSpecificFiles(File $phpcsFile, int $stackPtr): void { $content = $phpcsFile->getTokensAsString($stackPtr, 1); - foreach (self::OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES as $obsoleteRegex => $errorMessage) { - if (preg_match($obsoleteRegex, $content)) { + foreach (self::OBSOLETE_REGEX as $code => $data) { + if (preg_match($data['pattern'], $content)) { $phpcsFile->addWarning( - $errorMessage, + $data['message'], $stackPtr, - self::WARNING_CODES_OBSOLETE_REGEX_IN_SPECIFIC_PHTML_TEMPLATES[$obsoleteRegex] + $code ); } } From fe327128bae4048a6d4bd54d7c45fc2c10034dc0 Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Wed, 27 Oct 2021 14:12:28 +0100 Subject: [PATCH 88/99] magento/magento-coding-standard#315: Fixed undefined index in Magento2.Commenting.ClassPropertyPHPDocFormatting --- .../ClassPropertyPHPDocFormattingSniff.php | 155 +++++++++++------- .../ClassPropertyPHPDocFormattingUnitTest.inc | 10 ++ .../ClassPropertyPHPDocFormattingUnitTest.php | 1 + 3 files changed, 105 insertions(+), 61 deletions(-) diff --git a/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php b/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php index 035f73ae..ea13aca5 100644 --- a/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php +++ b/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php @@ -3,11 +3,12 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ +declare(strict_types=1); + namespace Magento2\Sniffs\Commenting; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\AbstractVariableSniff; -use PHP_CodeSniffer\Util\Tokens; use Magento2\Helpers\Commenting\PHPDocFormattingValidator; /** @@ -15,17 +16,19 @@ */ class ClassPropertyPHPDocFormattingSniff extends AbstractVariableSniff { - /** * @var array */ - private $ignoreTokens = [ + private const TOKENS_ALLOWED_BETWEEN_PHPDOC_AND_PROPERTY_NAME = [ T_PUBLIC, T_PRIVATE, T_PROTECTED, T_VAR, T_STATIC, T_WHITESPACE, + T_NS_SEPARATOR, + T_STRING, + T_COMMENT ]; /** @@ -38,15 +41,9 @@ class ClassPropertyPHPDocFormattingSniff extends AbstractVariableSniff */ public function __construct() { - $scopes = Tokens::$ooScopeTokens; $this->PHPDocFormattingValidator = new PHPDocFormattingValidator(); - $listen = [ - T_VARIABLE, - T_DOUBLE_QUOTED_STRING, - T_HEREDOC, - ]; - parent::__construct($scopes, $listen, true); + parent::__construct(); } /** @@ -56,111 +53,147 @@ public function processMemberVar(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); - $commentEnd = $phpcsFile->findPrevious($this->ignoreTokens, ($stackPtr - 1), null, true); + $commentEnd = $phpcsFile->findPrevious( + self::TOKENS_ALLOWED_BETWEEN_PHPDOC_AND_PROPERTY_NAME, + $stackPtr - 1, + null, + true + ); - if ($commentEnd !== false && $tokens[$commentEnd]['code'] === T_STRING) { - $commentEnd = $phpcsFile->findPrevious($this->ignoreTokens, ($commentEnd - 1), null, true); - } elseif ($commentEnd === false - || ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG - && $tokens[$commentEnd]['code'] !== T_COMMENT) - ) { + if ($commentEnd === false || $tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG) { $phpcsFile->addWarning('Missing PHP DocBlock for class property.', $stackPtr, 'Missing'); return; } $commentStart = $tokens[$commentEnd]['comment_opener']; - $foundVar = null; + $varAnnotationPosition = null; foreach ($tokens[$commentStart]['comment_tags'] as $tag) { if ($tokens[$tag]['content'] === '@var') { - if ($foundVar !== null) { - $error = 'Only one @var tag is allowed for class property declaration.'; - $phpcsFile->addWarning($error, $tag, 'DuplicateVar'); + if ($varAnnotationPosition !== null) { + $phpcsFile->addWarning( + 'Only one @var tag is allowed for class property declaration.', + $tag, + 'DuplicateVar' + ); } else { - $foundVar = $tag; + $varAnnotationPosition = $tag; } } } - if ($foundVar === null) { - $error = 'Class properties must have type declaration using @var tag.'; - $phpcsFile->addWarning($error, $stackPtr, 'MissingVar'); + if ($varAnnotationPosition === null) { + $phpcsFile->addWarning( + 'Class properties must have type declaration using @var tag.', + $stackPtr, + 'MissingVar' + ); return; } - $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $foundVar, $commentEnd); - if ($string === false || $tokens[$string]['line'] !== $tokens[$foundVar]['line']) { - $error = 'Content missing for @var tag in class property declaration.'; - $phpcsFile->addWarning($error, $foundVar, 'EmptyVar'); + $string = $phpcsFile->findNext(T_DOC_COMMENT_STRING, $varAnnotationPosition, $commentEnd); + if ($string === false || $tokens[$string]['line'] !== $tokens[$varAnnotationPosition]['line']) { + $phpcsFile->addWarning( + 'Content missing for @var tag in class property declaration.', + $varAnnotationPosition, + 'EmptyVar' + ); return; } // Check if class has already have meaningful description after @var tag - $isShortDescriptionAfterVar = $phpcsFile->findNext( + $shortDescriptionAfterVarPosition = $phpcsFile->findNext( T_DOC_COMMENT_STRING, - $foundVar + 4, + $varAnnotationPosition + 4, $commentEnd, false, null, false ); + if ($this->PHPDocFormattingValidator->providesMeaning( - $isShortDescriptionAfterVar, + $shortDescriptionAfterVarPosition, $commentStart, $tokens ) !== true) { preg_match( '`^((?:\|?(?:array\([^\)]*\)|[\\\\\[\]]+))*)( .*)?`i', - $tokens[($foundVar + 2)]['content'], + $tokens[($varAnnotationPosition + 2)]['content'], $varParts ); if ($varParts[1]) { return; } - $error = 'Short description must be before @var tag.'; - $phpcsFile->addWarning($error, $isShortDescriptionAfterVar, 'ShortDescriptionAfterVar'); - return; + $phpcsFile->addWarning( + 'Short description must be before @var tag.', + $shortDescriptionAfterVarPosition, + 'ShortDescriptionAfterVar' + ); } - // Check if class has already have meaningful description before @var tag - $isShortDescriptionPreviousVar = $phpcsFile->findPrevious( + $this->processPropertyShortDescription($phpcsFile, $stackPtr, $varAnnotationPosition, $commentStart); + } + + /** + * Check if class has already have meaningful description before var tag + * + * @param File $phpcsFile + * @param int $propertyNamePosition + * @param int $varAnnotationPosition + * @param int $commentStart + */ + private function processPropertyShortDescription( + File $phpcsFile, + int $propertyNamePosition, + int $varAnnotationPosition, + int $commentStart + ) { + $propertyShortDescriptionPosition = $phpcsFile->findPrevious( T_DOC_COMMENT_STRING, - $foundVar, + $varAnnotationPosition, $commentStart, false, null, false ); - if ($isShortDescriptionPreviousVar === false) { + if ($propertyShortDescriptionPosition === false) { return; } - $propertyNamePosition = $phpcsFile->findNext( - T_VARIABLE, - $foundVar, - null, - false, - null, - false - ); - if ($propertyNamePosition === false) { - return; - }; + $tokens = $phpcsFile->getTokens(); $propertyName = trim($tokens[$propertyNamePosition]['content'], '$'); - $shortDescription = strtolower($tokens[$isShortDescriptionPreviousVar]['content']); + $shortDescription = strtolower($tokens[$propertyShortDescriptionPosition]['content']); - if ($shortDescription === strtolower($propertyName)) { - $error = 'Short description duplicates class property name.'; - $phpcsFile->addWarning($error, $isShortDescriptionPreviousVar, 'AlreadyHaveMeaningfulNameVar'); - return; + if ($this->isDuplicate($propertyName, $shortDescription)) { + $phpcsFile->addWarning( + 'Short description duplicates class property name.', + $propertyShortDescriptionPosition, + 'AlreadyHaveMeaningfulNameVar' + ); } + } - $propertyNameParts = array_filter(preg_split('/(?=[A-Z])/', $propertyName)); + /** + * Does short description duplicate the property name + * + * @param string $propertyName + * @param string $shortDescription + * @return bool + */ + private function isDuplicate(string $propertyName, string $shortDescription): bool + { + return $this->clean($propertyName) === $this->clean($shortDescription); + } - if ($shortDescription === strtolower(implode(' ', $propertyNameParts))) { - $error = 'Short description duplicates class property name.'; - $phpcsFile->addWarning($error, $isShortDescriptionPreviousVar, 'AlreadyHaveMeaningfulNameVar'); - } + /** + * Return only A-Za-z characters converted to lowercase from the string + * + * @param string $string + * @return string + */ + private function clean(string $string): string + { + return strtolower(preg_replace('/[^A-Za-z]/', '', $string)); } /** diff --git a/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.inc b/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.inc index b7dee449..e001393d 100644 --- a/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.inc +++ b/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.inc @@ -114,6 +114,16 @@ class correctlyFormattedClassMemberDocBlock */ protected $rulePool; + /** + * @var \Magento\Store\Model\StoreManager + */ + private \Magento\Store\Model\StoreManager $decoratedStoreManager; + + /* + * @var \Magento\Eav\Model\Entity\Attribute\SetFactory + */ + private $attributeSetFactory; + /** * A description that includes test which is the same name as the variable is allowed * diff --git a/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.php b/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.php index 6a49be76..1d6ad272 100644 --- a/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.php +++ b/Magento2/Tests/Commenting/ClassPropertyPHPDocFormattingUnitTest.php @@ -34,6 +34,7 @@ public function getWarningList() 63 => 1, 68 => 1, 75 => 1, + 125 => 1 ]; } } From b5eab5ad44b956b529d99f9842fc1a75220bc471 Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Wed, 27 Oct 2021 14:26:09 +0100 Subject: [PATCH 89/99] magento/magento-coding-standard#317: Updated phpdocs duplicating property names --- .../Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php | 2 +- Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php | 2 -- Magento2/Sniffs/Security/XssTemplateSniff.php | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php b/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php index ea13aca5..b1404e32 100644 --- a/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php +++ b/Magento2/Sniffs/Commenting/ClassPropertyPHPDocFormattingSniff.php @@ -146,7 +146,7 @@ private function processPropertyShortDescription( int $propertyNamePosition, int $varAnnotationPosition, int $commentStart - ) { + ): void { $propertyShortDescriptionPosition = $phpcsFile->findPrevious( T_DOC_COMMENT_STRING, $varAnnotationPosition, diff --git a/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php b/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php index 2ad688ec..e15e41ad 100644 --- a/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php +++ b/Magento2/Sniffs/NamingConvention/InterfaceNameSniff.php @@ -28,8 +28,6 @@ class InterfaceNameSniff implements Sniff protected $warningCode = 'WrongInterfaceName'; /** - * Interface suffix. - * * @var string */ private $interfaceSuffix = 'Interface'; diff --git a/Magento2/Sniffs/Security/XssTemplateSniff.php b/Magento2/Sniffs/Security/XssTemplateSniff.php index f35943e5..3b4385e8 100644 --- a/Magento2/Sniffs/Security/XssTemplateSniff.php +++ b/Magento2/Sniffs/Security/XssTemplateSniff.php @@ -62,7 +62,7 @@ class XssTemplateSniff implements Sniff protected $allowedFunctions = ['count']; /** - * Allowed annotations. + * Annotations preventing from static analysis (skipping this sniff) * * @var array */ From 9ffb1a53dc00ddd42e6ca3847fae365c9be2193b Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Wed, 27 Oct 2021 18:09:56 +0100 Subject: [PATCH 90/99] Extracted js tests to a separate build --- .github/workflows/php.yml | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 1af77466..119d380e 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -7,8 +7,7 @@ on: branches: [ master, develop ] jobs: - build: - + php: runs-on: ubuntu-latest strategy: fail-fast: false @@ -41,10 +40,6 @@ jobs: - name: Install dependencies run: npm install - - name: Run ESLint - run: npm run eslint -- eslint/rules - - name: Run JSCS - run: npm run jscs eslint/rules Magento2 - name: Validate composer run: composer validate @@ -63,3 +58,23 @@ jobs: - name: Run framework suite run: vendor/bin/phpcs --standard=Magento2Framework Magento2/Helpers Magento2/Sniffs Magento2Framework/Sniffs + js: + runs-on: ubuntu-latest + name: Javascript tests + + steps: + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: '16' + + - uses: actions/checkout@v2 + + - name: Install dependencies + run: npm install + + - name: Run ESLint + run: npm run eslint -- eslint/rules + + - name: Run JSCS + run: npm run jscs eslint/rules Magento2 From c4e2ecae195495c253d461bdb7b925267657c403 Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Thu, 28 Oct 2021 13:18:59 +0100 Subject: [PATCH 91/99] magento/magento-coding-standard#314: Fixed AutogeneratedClassNotInConstructorSniff --- ...utogeneratedClassNotInConstructorSniff.php | 235 ++++++++---------- ...tedClassNotInConstructorUnitTest.1.php.inc | 22 +- ...tedClassNotInConstructorUnitTest.2.php.inc | 22 +- ...generatedClassNotInConstructorUnitTest.php | 5 +- 4 files changed, 153 insertions(+), 131 deletions(-) diff --git a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php index 6c56d07e..33c0bdf4 100644 --- a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php +++ b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php @@ -17,22 +17,16 @@ class AutogeneratedClassNotInConstructorSniff implements Sniff { private const ERROR_CODE = 'AutogeneratedClassNotInConstructor'; - /** - * @var array - */ - private $constructorParameters = []; - - /** - * @var array - */ - private $uses = []; + private const AUTOGENERATED_CLASS_SUFFIXES = [ + 'Factory' + ]; /** * @inheritdoc */ public function register() { - return [T_FUNCTION, T_DOUBLE_COLON, T_USE]; + return [T_DOUBLE_COLON]; } /** @@ -40,187 +34,178 @@ public function register() */ public function process(File $phpcsFile, $stackPtr) { - if ($phpcsFile->getTokens()[$stackPtr]['type'] === 'T_USE') { - $this->registerUse($phpcsFile, $stackPtr); + if (!$this->isClass($phpcsFile)) { + return; } - if ($phpcsFile->getTokens()[$stackPtr]['type'] === 'T_FUNCTION') { - $this->registerConstructorParameters($phpcsFile, $stackPtr); + + $tokens = $phpcsFile->getTokens(); + + if ($tokens[$stackPtr - 1]['content'] !== 'ObjectManager' + && $tokens[$stackPtr + 1]['content'] !== 'getInstance' + ) { + return; } - if ($phpcsFile->getTokens()[$stackPtr]['type'] === 'T_DOUBLE_COLON') { - if (!$this->isObjectManagerGetInstance($phpcsFile, $stackPtr)) { - return; - } - $statementStart = $phpcsFile->findStartOfStatement($stackPtr); - $statementEnd = $phpcsFile->findEndOfStatement($stackPtr); - $equalsPtr = $phpcsFile->findNext(T_EQUAL, $statementStart, $statementEnd); + if (!isset($tokens[$stackPtr + 4]) || $tokens[$stackPtr + 4]['code'] !== T_SEMICOLON) { + $this->validateRequestedClass( + $phpcsFile, + $phpcsFile->findNext(T_OBJECT_OPERATOR, $stackPtr) + ); + return; + } - if (!$equalsPtr) { - return; - } + $objectManagerVariableName = $this->getObjectManagerVariableName($phpcsFile, $stackPtr); - if (!$this->isVariableInConstructorParameters($phpcsFile, $equalsPtr, $statementEnd)) { - $className = $this->obtainClassToGetOrCreate($phpcsFile, $stackPtr, $statementEnd); + if (!$objectManagerVariableName) { + return; + } - $phpcsFile->addError( - sprintf("Class %s needs to be requested in constructor, " . - "otherwise compiler will not be able to find and generate these classes", $className), - $stackPtr, - self::ERROR_CODE - ); - } + $variablePosition = $phpcsFile->findNext(T_VARIABLE, $stackPtr, null, false, $objectManagerVariableName); + if ($variablePosition) { + $this->validateRequestedClass($phpcsFile, $phpcsFile->findNext(T_OBJECT_OPERATOR, $variablePosition)); } } /** - * Check if it is a ObjectManager::getInstance + * Check if the class is instantiated via get/create method, it is autogenerated and present in constructor * * @param File $phpcsFile - * @param int $stackPtr - * @return bool + * @param int $arrowPosition */ - private function isObjectManagerGetInstance(File $phpcsFile, int $stackPtr): bool + private function validateRequestedClass(File $phpcsFile, int $arrowPosition): void { - $prev = $phpcsFile->findPrevious(T_STRING, $stackPtr - 1); - $next = $phpcsFile->findNext(T_STRING, $stackPtr + 1); - return $prev && - $next && - $phpcsFile->getTokens()[$prev]['content'] === 'ObjectManager' && - $phpcsFile->getTokens()[$next]['content'] === 'getInstance'; + $requestedClass = $this->getRequestedClass($phpcsFile, $arrowPosition); + + if (!$requestedClass + || !$this->isClassAutogenerated($requestedClass) + || $this->isConstructorParameter($phpcsFile, $requestedClass) + ) { + return; + } + + $phpcsFile->addError( + sprintf( + 'Class %s needs to be requested in constructor, ' . + 'otherwise compiler will not be able to find and generate this classes', + $requestedClass + ), + $arrowPosition, + self::ERROR_CODE + ); } /** - * Get the complete class namespace from the use's + * Does the class have the suffix common for autogenerated classes e.g. Factory * * @param string $className - * @return string + * @return bool */ - private function getClassNamespace(string $className): string + private function isClassAutogenerated(string $className): bool { - foreach ($this->uses as $key => $use) { - if ($key === $className) { - return $use; + foreach (self::AUTOGENERATED_CLASS_SUFFIXES as $suffix) { + if (substr($className, -strlen($suffix)) === $suffix) { + return true; } } - return $className; + return false; } /** - * Register php uses + * Get the variable name to which the ObjectManager::getInstance() result is assigned * * @param File $phpcsFile * @param int $stackPtr + * @return string|null */ - private function registerUse(File $phpcsFile, int $stackPtr): void + private function getObjectManagerVariableName(File $phpcsFile, int $stackPtr): ?string { - $useEnd = $phpcsFile->findEndOfStatement($stackPtr); - $use = []; - $usePosition = $stackPtr; - while ($usePosition = $phpcsFile->findNext(T_STRING, $usePosition + 1, $useEnd)) { - $use[] = $phpcsFile->getTokens()[$usePosition]['content']; + $matches = []; + $found = preg_match( + '/(\$[A-Za-z]+) ?= ?ObjectManager::getInstance\(\);/', + $phpcsFile->getTokensAsString($stackPtr - 5, 10), + $matches + ); + + if (!$found || !isset($matches[1])) { + return null; } - $key = end($use); - if ($phpcsFile->findNext(T_AS, $stackPtr, $useEnd)) { - $this->uses[$key] = implode("\\", array_slice($use, 0, count($use) - 1)); - } else { - $this->uses[$key] = implode("\\", $use); - } + return $matches[1]; } /** - * Register php constructor parameters + * Get class name requested from ObjectManager * * @param File $phpcsFile - * @param int $stackPtr + * @param int $callerPosition + * @return string|null */ - private function registerConstructorParameters(File $phpcsFile, int $stackPtr): void + private function getRequestedClass(File $phpcsFile, int $callerPosition): ?string { - $functionName = $phpcsFile->getDeclarationName($stackPtr); - if ($functionName == '__construct') { - $this->constructorParameters = $phpcsFile->getMethodParameters($stackPtr); + if (!isset($phpcsFile->getTokens()[$callerPosition + 10])) { + return null; } - } - /** - * Get next token - * - * @param File $phpcsFile - * @param int $from - * @param int $to - * @param int|string|array $types - * @return mixed - */ - private function getNext(File $phpcsFile, int $from, int $to, $types) - { - return $phpcsFile->getTokens()[$phpcsFile->findNext($types, $from + 1, $to)]; - } + $matches = []; + $found = preg_match( + '/->(get|create)\(([A-Za-z]+)::class/', + $phpcsFile->getTokensAsString($callerPosition, 7), + $matches + ); - /** - * Get previous token - * - * @param File $phpcsFile - * @param int $from - * @param int|string|array $types - * @return mixed - */ - private function getPrevious(File $phpcsFile, int $from, $types) - { - return $phpcsFile->getTokens()[$phpcsFile->findPrevious($types, $from - 1)]; + if (!$found || !isset($matches[2])) { + return null; + } + + return $matches[2]; } /** - * Get name of the variable without $ + * Does the file contain class declaration * - * @param string $parameterName - * @return string + * @param File $phpcsFile + * @return bool */ - protected function variableName(string $parameterName): string + private function isClass(File $phpcsFile): bool { - return str_replace('$', '', $parameterName); + foreach ($phpcsFile->getTokens() as $token) { + if ($token['code'] === T_CLASS) { + return true; + } + } + return false; } /** - * Checks if a variable is present in the constructor parameters + * Get an array of constructor parameters * * @param File $phpcsFile - * @param int $equalsPtr - * @param int $statementEnd - * @return bool + * @return array */ - private function isVariableInConstructorParameters(File $phpcsFile, int $equalsPtr, int $statementEnd): bool + private function getConstructorParameters(File $phpcsFile): array { - if ($variable = $phpcsFile->findNext(T_VARIABLE, $equalsPtr, $statementEnd)) { - $variableName = $phpcsFile->getTokens()[$variable]['content']; - if ($variableName === '$this') { - $variableName = $this->getNext($phpcsFile, $variable, $statementEnd, T_STRING)['content']; - } - foreach ($this->constructorParameters as $parameter) { - $parameterName = $parameter['name']; - if ($this->variableName($parameterName) === $this->variableName($variableName)) { - return true; - } + foreach ($phpcsFile->getTokens() as $stackPtr => $token) { + if ($token['code'] === T_FUNCTION && $phpcsFile->getDeclarationName($stackPtr) === '__construct') { + return $phpcsFile->getMethodParameters($stackPtr); } } - return false; + return []; } /** - * Obtain the class inside ObjectManager::getInstance()->get|create() + * Is the class name present between constructor parameters * * @param File $phpcsFile - * @param int $next - * @param int $statementEnd - * @return string + * @param string $className + * @return bool */ - private function obtainClassToGetOrCreate(File $phpcsFile, int $next, int $statementEnd): string + private function isConstructorParameter(File $phpcsFile, string $className): bool { - while ($next = $phpcsFile->findNext(T_DOUBLE_COLON, $next + 1, $statementEnd)) { - if ($this->getNext($phpcsFile, $next, $statementEnd, T_STRING)['content'] === 'class') { - $className = $this->getPrevious($phpcsFile, $next, T_STRING)['content']; + foreach ($this->getConstructorParameters($phpcsFile) as $parameter) { + if (strpos($parameter['content'], $className) !== false) { + return true; } } - - return $this->getClassNamespace($className); + return false; } } diff --git a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.1.php.inc b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.1.php.inc index f7a461ed..c5833baf 100644 --- a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.1.php.inc +++ b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.1.php.inc @@ -12,10 +12,10 @@ use Magento2\OneModel as Model; class Good { public function __construct( - Model $model = null + ModelFactory $model = null ) { - $this->model = $model ?? ObjectManager::getInstance()->get(Model::class); + $this->model = $model ?? ObjectManager::getInstance()->get(ModelFactory::class); } /** @@ -23,8 +23,8 @@ class Good */ public function otherMethodThatCallsGetInstanceBad(): void { - $model = ObjectManager::getInstance()->get(Model::class); - $model->something(); + $modelFactory = ObjectManager::getInstance()->get(OtherFactory::class); + $modelFactory->create(); } /** @@ -35,4 +35,18 @@ class Good $model = $this->model ?? ObjectManager::getInstance()->get(Model::class); $model->something(); } + + public function variablePositive(): void + { + $objectManager = ObjectManager::getInstance(); + $this->_entityFactory = $objectManager->get(EntityFactoryInterface::class); + } + + public function variableNegative(): void + { + $objectManager = ObjectManager::getInstance(); + $this->_entityFactory = $objectManager->get(EntityFactory::class); + } } + + diff --git a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc index a72f5bb0..e495ef6c 100644 --- a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc +++ b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc @@ -7,11 +7,31 @@ declare(strict_types = 1); namespace Magento2\Tests\PHP; +use Magento\Catalog\Model\Product; +use Magento\Eav\Api\AttributeRepositoryInterface; +use Magento\Eav\Setup\AddOptionToAttribute; +use Magento\Eav\Setup\EavSetup; +use Magento\Eav\Setup\EavSetupFactory; +use Magento\Framework\App\ObjectManager; +use Magento\Framework\Setup\ModuleDataSetupInterface; + class Bad { public function __construct() { - $this->model = ObjectManager::getInstance()->get(Model::class); + $this->model = ObjectManager::getInstance()->get(ModelFactory::class); + } + + protected function setUp(): void + { + ObjectManager::getInstance() + ->get(EavSetupFactory::class); + $objectManager = ObjectManager::getInstance(); + + /** @var EavSetup $eavSetup */ + $this->eavSetup = $objectManager + ->get(EavSetupFactory::class) + ->create(['setup' => $this->setup]); } } diff --git a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php index 9122213f..84ebaaf2 100644 --- a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php +++ b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php @@ -19,11 +19,14 @@ public function getErrorList($filename = '') if ($filename === 'AutogeneratedClassNotInConstructorUnitTest.1.php.inc') { return [ 26 => 1, + 48 => 1 ]; } if ($filename === 'AutogeneratedClassNotInConstructorUnitTest.2.php.inc') { return [ - 14 => 1, + 22 => 1, + 28 => 1, + 33 => 1 ]; } return []; From de99e8b6bcc671d3350abd6cf83d070c372eda9c Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Thu, 28 Oct 2021 13:44:10 +0100 Subject: [PATCH 92/99] magento/magento-coding-standard#319: Corrected regex --- .../PHP/AutogeneratedClassNotInConstructorSniff.php | 8 ++------ .../AutogeneratedClassNotInConstructorUnitTest.2.php.inc | 3 +++ .../PHP/AutogeneratedClassNotInConstructorUnitTest.php | 3 ++- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php index 33c0bdf4..b63c0e96 100644 --- a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php +++ b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php @@ -142,14 +142,10 @@ private function getObjectManagerVariableName(File $phpcsFile, int $stackPtr): ? */ private function getRequestedClass(File $phpcsFile, int $callerPosition): ?string { - if (!isset($phpcsFile->getTokens()[$callerPosition + 10])) { - return null; - } - $matches = []; $found = preg_match( - '/->(get|create)\(([A-Za-z]+)::class/', - $phpcsFile->getTokensAsString($callerPosition, 7), + '/->(get|create)\(([A-Za-z\\\]+)::class/', + $phpcsFile->getTokensAsString($callerPosition, $phpcsFile->findNext(T_CLOSE_PARENTHESIS, $callerPosition)), $matches ); diff --git a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc index e495ef6c..0e474247 100644 --- a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc +++ b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.2.php.inc @@ -32,6 +32,9 @@ class Bad $this->eavSetup = $objectManager ->get(EavSetupFactory::class) ->create(['setup' => $this->setup]); + + ObjectManager::getInstance() + ->get(\Full\Class\NameFactory::class); } } diff --git a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php index 84ebaaf2..0424ac06 100644 --- a/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php +++ b/Magento2/Tests/PHP/AutogeneratedClassNotInConstructorUnitTest.php @@ -26,7 +26,8 @@ public function getErrorList($filename = '') return [ 22 => 1, 28 => 1, - 33 => 1 + 33 => 1, + 37 => 1 ]; } return []; From d903f9c5ce9e96d2c878e86174e56d3afc707e95 Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Thu, 28 Oct 2021 13:56:12 +0100 Subject: [PATCH 93/99] magento/magento-coding-standard#319: Corrected message --- Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php index b63c0e96..0b397523 100644 --- a/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php +++ b/Magento2/Sniffs/PHP/AutogeneratedClassNotInConstructorSniff.php @@ -86,7 +86,7 @@ private function validateRequestedClass(File $phpcsFile, int $arrowPosition): vo $phpcsFile->addError( sprintf( 'Class %s needs to be requested in constructor, ' . - 'otherwise compiler will not be able to find and generate this classes', + 'otherwise compiler will not be able to find and generate this class', $requestedClass ), $arrowPosition, From 4b42f01f699230bdcf8c1f1e3f8050132001bc59 Mon Sep 17 00:00:00 2001 From: Marc Ginesta Date: Thu, 28 Oct 2021 17:32:33 +0200 Subject: [PATCH 94/99] Run polyjuice to get eslintrc-jscs from original jscsrc --- eslint/.eslintrc | 3 +- eslint/.eslintrc-jscs | 111 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 eslint/.eslintrc-jscs diff --git a/eslint/.eslintrc b/eslint/.eslintrc index 8f800d85..88aa88c7 100644 --- a/eslint/.eslintrc +++ b/eslint/.eslintrc @@ -3,6 +3,7 @@ "./.eslintrc-reset", "./.eslintrc-magento", "./.eslintrc-jquery", - "./.eslintrc-misc" + "./.eslintrc-misc", + "./.eslintrc-jscs" ] } diff --git a/eslint/.eslintrc-jscs b/eslint/.eslintrc-jscs new file mode 100644 index 00000000..df444056 --- /dev/null +++ b/eslint/.eslintrc-jscs @@ -0,0 +1,111 @@ +{ + "rules": { + "no-with": 2, + "brace-style": [ + 2, + "1tbs", + { + "allowSingleLine": true + } + ], + "space-before-function-paren": [ + 2, + "always" + ], + "curly": [ + 2, + "all" + ], + "keyword-spacing": [ + 2, + {} + ], + "no-empty": [ + 2, + { + "allowEmptyCatch": true + } + ], + "no-mixed-spaces-and-tabs": 2, + "no-multiple-empty-lines": 2, + "no-multi-str": 2, + "key-spacing": [ + 2, + { + "beforeColon": false, + "afterColon": true + } + ], + "space-unary-ops": [ + 2, + { + "words": false, + "nonwords": false + } + ], + "no-spaced-func": 2, + "array-bracket-spacing": [ + 2, + "never", + { + "singleValue": true + } + ], + "space-in-parens": [ + 2, + "never" + ], + "comma-dangle": [ + 2, + "never" + ], + "no-trailing-spaces": 2, + "yoda": [ + 2, + "never" + ], + "dot-notation": [ + 2, + { + "allowPattern": "^[a-z]+(_[a-z]+)+$" + } + ], + "camelcase": [ + 2, + { + "properties": "never" + } + ], + "comma-style": [ + 2, + "last" + ], + "eol-last": 2, + "one-var": [ + 2, + "always" + ], + "operator-linebreak": [ + 2, + "after" + ], + "wrap-iife": 2, + "space-infix-ops": 2, + "space-before-blocks": [ + 2, + "always" + ], + "indent": [ + 2, + 4, + { + "SwitchCase": 1 + } + ], + "quotes": [ + 2, + "single" + ], + "valid-jsdoc": 2 + } +} From 3c9c35936c342b78d7a3ec2155c6be0ad1ff51d6 Mon Sep 17 00:00:00 2001 From: Marc Ginesta Date: Thu, 28 Oct 2021 17:38:42 +0200 Subject: [PATCH 95/99] Tune space-before-function-paren --- eslint/.eslintrc-jscs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/eslint/.eslintrc-jscs b/eslint/.eslintrc-jscs index df444056..79b1684e 100644 --- a/eslint/.eslintrc-jscs +++ b/eslint/.eslintrc-jscs @@ -10,7 +10,11 @@ ], "space-before-function-paren": [ 2, - "always" + { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + } ], "curly": [ 2, From d78440c7c2bcaf507426d2936aa1646db6403ef1 Mon Sep 17 00:00:00 2001 From: Marc Ginesta Date: Thu, 28 Oct 2021 17:40:45 +0200 Subject: [PATCH 96/99] Tune valid-jsdoc --- eslint/.eslintrc-jscs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/eslint/.eslintrc-jscs b/eslint/.eslintrc-jscs index 79b1684e..5e0f3822 100644 --- a/eslint/.eslintrc-jscs +++ b/eslint/.eslintrc-jscs @@ -110,6 +110,13 @@ 2, "single" ], - "valid-jsdoc": 2 + "valid-jsdoc": [ + 2, + { + "requireParamDescription": false, + "requireReturnDescription": false, + "requireReturn": false + } + ] } } From 112b8e0f5f4de9d161c97b9344071b6364d10220 Mon Sep 17 00:00:00 2001 From: Marc Ginesta Date: Thu, 28 Oct 2021 18:16:53 +0200 Subject: [PATCH 97/99] Use eslint rule to disable/enable curly instead of jscs --- eslint/rules/jquery-no-andSelf.js | 4 ++-- eslint/rules/jquery-no-bind-unbind.js | 4 ++-- eslint/rules/jquery-no-click-event-shorthand.js | 4 ++-- eslint/rules/jquery-no-delegate-undelegate.js | 4 ++-- eslint/rules/jquery-no-event-shorthand.js | 4 ++-- eslint/rules/jquery-no-size.js | 4 ++-- eslint/rules/jquery-no-trim.js | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/eslint/rules/jquery-no-andSelf.js b/eslint/rules/jquery-no-andSelf.js index a72b694b..c17d205f 100644 --- a/eslint/rules/jquery-no-andSelf.js +++ b/eslint/rules/jquery-no-andSelf.js @@ -31,11 +31,11 @@ module.exports = { * @param {Object} node - The node to check. */ CallExpression: function (node) { - // jscs:disable requireCurlyBraces + /* eslint-disable curly */ if (node.callee.type !== 'MemberExpression') return; if (node.callee.property.name !== 'andSelf') return; - // jscs:enable requireCurlyBraces + /* eslint-enable curly */ if (utils.isjQuery(node)) { context.report({ diff --git a/eslint/rules/jquery-no-bind-unbind.js b/eslint/rules/jquery-no-bind-unbind.js index d64a7c88..8ee640fc 100644 --- a/eslint/rules/jquery-no-bind-unbind.js +++ b/eslint/rules/jquery-no-bind-unbind.js @@ -31,11 +31,11 @@ module.exports = { * @param {Object} node - The node to check. */ CallExpression: function (node) { - // jscs:disable requireCurlyBraces + /* eslint-disable curly */ if (node.callee.type !== 'MemberExpression') return; if (!['bind', 'unbind'].includes(node.callee.property.name)) return; - // jscs:enable requireCurlyBraces + /* eslint-enable curly */ if (utils.isjQuery(node)) { context.report({ diff --git a/eslint/rules/jquery-no-click-event-shorthand.js b/eslint/rules/jquery-no-click-event-shorthand.js index 3ae435dd..3977f466 100644 --- a/eslint/rules/jquery-no-click-event-shorthand.js +++ b/eslint/rules/jquery-no-click-event-shorthand.js @@ -34,11 +34,11 @@ module.exports = { 'mouseup', 'mousemove','mouseover', 'mouseout', 'mouseenter', 'mouseleave', 'change', 'select', 'submit', 'keydown', 'keypress', 'keyup', 'contextmenu', 'click']; - // jscs:disable requireCurlyBraces + /* eslint-disable curly */ if (node.callee.type !== 'MemberExpression') return; if (!names.includes(node.callee.property.name)) return; - // jscs:enable requireCurlyBraces + /* eslint-enable curly */ if (utils.isjQuery(node)) { name = node.callee.property.name; diff --git a/eslint/rules/jquery-no-delegate-undelegate.js b/eslint/rules/jquery-no-delegate-undelegate.js index 8eb219ee..4a10f6e1 100644 --- a/eslint/rules/jquery-no-delegate-undelegate.js +++ b/eslint/rules/jquery-no-delegate-undelegate.js @@ -31,11 +31,11 @@ module.exports = { * @param {Object} node - The node to check. */ CallExpression: function (node) { - // jscs:disable requireCurlyBraces + /* eslint-disable curly */ if (node.callee.type !== 'MemberExpression') return; if (!['delegate', 'undelegate'].includes(node.callee.property.name)) return; - // jscs:enable requireCurlyBraces + /* eslint-enable curly */ if (utils.isjQuery(node)) { context.report({ diff --git a/eslint/rules/jquery-no-event-shorthand.js b/eslint/rules/jquery-no-event-shorthand.js index 4715c6b9..4344ffc3 100644 --- a/eslint/rules/jquery-no-event-shorthand.js +++ b/eslint/rules/jquery-no-event-shorthand.js @@ -31,11 +31,11 @@ module.exports = { var names = ['load', 'unload', 'error'], name; - // jscs:disable requireCurlyBraces + /* eslint-disable curly */ if (node.callee.type !== 'MemberExpression') return; if (!names.includes(node.callee.property.name)) return; - // jscs:enable requireCurlyBraces + /* eslint-enable curly */ if (utils.isjQuery(node)) { name = node.callee.property.name; diff --git a/eslint/rules/jquery-no-size.js b/eslint/rules/jquery-no-size.js index adf58985..3123cde4 100644 --- a/eslint/rules/jquery-no-size.js +++ b/eslint/rules/jquery-no-size.js @@ -31,11 +31,11 @@ module.exports = { * @param {Object} node - The node to check. */ CallExpression: function (node) { - // jscs:disable requireCurlyBraces + /* eslint-disable curly */ if (node.callee.type !== 'MemberExpression') return; if (node.callee.property.name !== 'size') return; - // jscs:enable requireCurlyBraces + /* eslint-enable curly */ if (utils.isjQuery(node)) { context.report({ diff --git a/eslint/rules/jquery-no-trim.js b/eslint/rules/jquery-no-trim.js index ec96ddd5..471d5a50 100644 --- a/eslint/rules/jquery-no-trim.js +++ b/eslint/rules/jquery-no-trim.js @@ -29,13 +29,13 @@ module.exports = { * @param {Object} node - The node to check. */ CallExpression: function (node) { - // jscs:disable requireCurlyBraces + /* eslint-disable curly */ if (node.callee.type !== 'MemberExpression') return; if (node.callee.object.name !== '$') return; if (node.callee.property.name !== 'trim') return; - // jscs:enable requireCurlyBraces + /* eslint-enable curly */ context.report({ node: node, From 040d1563f5b6a6eea33653f1b8312aeff4b691fa Mon Sep 17 00:00:00 2001 From: Marc Ginesta Date: Thu, 28 Oct 2021 18:27:47 +0200 Subject: [PATCH 98/99] Remove JSCS references on repo --- .github/workflows/php.yml | 2 - jscs/.jscsrc | 119 - package-lock.json | 6230 ++++--------------------------------- package.json | 6 +- 4 files changed, 604 insertions(+), 5753 deletions(-) delete mode 100644 jscs/.jscsrc diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 1af77466..e3faabb8 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -43,8 +43,6 @@ jobs: run: npm install - name: Run ESLint run: npm run eslint -- eslint/rules - - name: Run JSCS - run: npm run jscs eslint/rules Magento2 - name: Validate composer run: composer validate diff --git a/jscs/.jscsrc b/jscs/.jscsrc deleted file mode 100644 index a7a0184b..00000000 --- a/jscs/.jscsrc +++ /dev/null @@ -1,119 +0,0 @@ -{ - "disallowKeywords": [ - "with", - "continue" - ], - "disallowKeywordsOnNewLine": [ - "else" - ], - "disallowSpaceBeforeBinaryOperators": [ - "," - ], - "disallowSpacesInFunctionDeclaration": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "requireCurlyBraces": [ - "if", - "else", - "for", - "while", - "do", - "try", - "catch" - ], - "requirePaddingNewlinesBeforeKeywords": [ - "do", - "for", - "if", - "switch", - "case", - "try", - "void", - "while", - "with", - "return" - ], - "requireSpaceBeforeKeywords": [ - "else", - "while", - "catch" - ], - "requireSpaceAfterKeywords": [ - "if", - "else", - "for", - "while", - "do", - "switch", - "case", - "return", - "try", - "catch", - "function", - "typeof" - ], - "requireSpacesInAnonymousFunctionExpression": { - "beforeOpeningCurlyBrace": true, - "beforeOpeningRoundBrace": true - }, - "disallowNewlineBeforeBlockStatements": true, - "disallowDanglingUnderscores": null, - "disallowEmptyBlocks": true, - "disallowMixedSpacesAndTabs": true, - "disallowMultipleLineBreaks": true, - "disallowMultipleLineStrings": true, - "disallowSpaceAfterObjectKeys": true, - "disallowSpaceAfterPrefixUnaryOperators": true, - "disallowSpaceBeforePostfixUnaryOperators": true, - "disallowSpacesInCallExpression": true, - "disallowSpacesInsideArrayBrackets": "all", - "disallowSpacesInsideObjectBrackets": "all", - "disallowSpacesInsideParentheses": true, - "disallowTrailingComma": true, - "disallowTrailingWhitespace": true, - "disallowYodaConditions": true, - "maxErrors": null, - "requireBlocksOnNewline": true, - "requireDotNotation": "except_snake_case", - "requireCamelCaseOrUpperCaseIdentifiers": true, - "requireCapitalizedConstructors": true, - "requireCommaBeforeLineBreak": true, - "requireLineBreakAfterVariableAssignment": true, - "requireLineFeedAtFileEnd": true, - "requireMultipleVarDecl": "onevar", - "requireOperatorBeforeLineBreak": true, - "requirePaddingNewLinesAfterUseStrict": true, - "requirePaddingNewLinesInObjects": true, - "requireParenthesesAroundIIFE": true, - "requireSpaceAfterBinaryOperators": true, - "requireSpaceBeforeBinaryOperators": true, - "requireSpaceBeforeBlockStatements": true, - "requireSpaceBeforeObjectValues": true, - "requireSpaceBetweenArguments": true, - "requireSpacesInConditionalExpression": true, - "requireSpacesInForStatement": true, - "validateIndentation": 4, - "validateParameterSeparator": ", ", - "validateQuoteMarks": "'", - "jsDoc": { - "checkAnnotations": { - "preset": "jsdoc3", - "extra": { - "override": true, - "inheritdoc": true, - "api": true - } - }, - "checkParamNames": true, - "checkRedundantParams": true, - "checkRedundantReturns": true, - "checkReturnTypes": true, - "checkTypes": "capitalizedNativeCase", - "enforceExistence": "exceptExports", - "requireHyphenBeforeDescription": true, - "requireParamTypes": true - } -} diff --git a/package-lock.json b/package-lock.json index f635c94d..ddb1aab8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,7 @@ "version": "1.0.0", "license": "ISC", "devDependencies": { - "eslint": "^7.32.0", - "jscs": "^2.1.1" + "eslint": "^7.32.0" } }, "node_modules/@babel/code-frame": { @@ -23,9 +22,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -193,38 +192,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", - "dev": true, - "dependencies": { - "stable": "~0.1.3" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -267,21 +234,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/ast-traverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", - "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", - "dev": true - }, - "node_modules/ast-types": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", - "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -291,318 +243,12 @@ "node": ">=8" } }, - "node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-core": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", - "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", - "dev": true, - "dependencies": { - "babel-plugin-constant-folding": "^1.0.1", - "babel-plugin-dead-code-elimination": "^1.0.2", - "babel-plugin-eval": "^1.0.1", - "babel-plugin-inline-environment-variables": "^1.0.1", - "babel-plugin-jscript": "^1.0.4", - "babel-plugin-member-expression-literals": "^1.0.1", - "babel-plugin-property-literals": "^1.0.1", - "babel-plugin-proto-to-assign": "^1.0.3", - "babel-plugin-react-constant-elements": "^1.0.3", - "babel-plugin-react-display-name": "^1.0.3", - "babel-plugin-remove-console": "^1.0.1", - "babel-plugin-remove-debugger": "^1.0.1", - "babel-plugin-runtime": "^1.0.7", - "babel-plugin-undeclared-variables-check": "^1.0.2", - "babel-plugin-undefined-to-void": "^1.1.6", - "babylon": "^5.8.38", - "bluebird": "^2.9.33", - "chalk": "^1.0.0", - "convert-source-map": "^1.1.0", - "core-js": "^1.0.0", - "debug": "^2.1.1", - "detect-indent": "^3.0.0", - "esutils": "^2.0.0", - "fs-readdir-recursive": "^0.1.0", - "globals": "^6.4.0", - "home-or-tmp": "^1.0.0", - "is-integer": "^1.0.4", - "js-tokens": "1.0.1", - "json5": "^0.4.0", - "lodash": "^3.10.0", - "minimatch": "^2.0.3", - "output-file-sync": "^1.1.0", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", - "regenerator": "0.8.40", - "regexpu": "^1.3.0", - "repeating": "^1.1.2", - "resolve": "^1.1.6", - "shebang-regex": "^1.0.0", - "slash": "^1.0.0", - "source-map": "^0.5.0", - "source-map-support": "^0.2.10", - "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0", - "try-resolve": "^1.0.0" - } - }, - "node_modules/babel-core/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-core/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-core/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-core/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/babel-core/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-core/node_modules/globals": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", - "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-core/node_modules/js-tokens": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", - "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", - "dev": true - }, - "node_modules/babel-core/node_modules/minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dev": true, - "dependencies": { - "brace-expansion": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/babel-core/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/babel-core/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-core/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-core/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-jscs": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", - "integrity": "sha1-CjRwRrSBRay8pW6MjtX3NrxU+dA=", - "dev": true, - "dependencies": { - "babel-core": "~5.8.3", - "lodash.assign": "^3.2.0" - } - }, - "node_modules/babel-plugin-constant-folding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", - "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", - "dev": true - }, - "node_modules/babel-plugin-dead-code-elimination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", - "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", - "dev": true - }, - "node_modules/babel-plugin-eval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", - "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", - "dev": true - }, - "node_modules/babel-plugin-inline-environment-variables": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", - "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", - "dev": true - }, - "node_modules/babel-plugin-jscript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", - "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", - "dev": true - }, - "node_modules/babel-plugin-member-expression-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", - "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", - "dev": true - }, - "node_modules/babel-plugin-property-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", - "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", - "dev": true - }, - "node_modules/babel-plugin-proto-to-assign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", - "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", - "dev": true, - "dependencies": { - "lodash": "^3.9.3" - } - }, - "node_modules/babel-plugin-react-constant-elements": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", - "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", - "dev": true - }, - "node_modules/babel-plugin-react-display-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", - "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", - "dev": true - }, - "node_modules/babel-plugin-remove-console": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", - "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", - "dev": true - }, - "node_modules/babel-plugin-remove-debugger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", - "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", - "dev": true - }, - "node_modules/babel-plugin-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", - "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", - "dev": true - }, - "node_modules/babel-plugin-undeclared-variables-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", - "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", - "dev": true, - "dependencies": { - "leven": "^1.0.2" - } - }, - "node_modules/babel-plugin-undefined-to-void": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", - "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", - "dev": true - }, - "node_modules/babylon": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", - "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -613,25 +259,6 @@ "concat-map": "0.0.1" } }, - "node_modules/breakable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", - "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", - "dev": true - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -641,28 +268,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -679,29 +284,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/cli-table": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", - "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", - "dev": true, - "dependencies": { - "colors": "1.0.3" - }, - "engines": { - "node": ">= 0.2.0" - } - }, - "node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -720,1709 +302,273 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true, - "engines": { - "node": ">=0.1.90" - } + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, - "node_modules/commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "graceful-readlink": ">= 1.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">= 0.6.x" + "node": ">= 8" } }, - "node_modules/comment-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.2.tgz", - "integrity": "sha1-PAPwd2uGo239mgosl8YwfzMggv4=", + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "dependencies": { - "readable-stream": "^2.0.4" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/comment-parser/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/comment-parser/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/comment-parser/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, - "node_modules/commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "dependencies": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "bin": { - "commonize": "bin/commonize" + "ansi-colors": "^4.1.1" }, "engines": { - "node": ">= 0.8" + "node": ">=8.6" } }, - "node_modules/commoner/node_modules/ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commoner/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/commoner/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/commoner/node_modules/recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "dependencies": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "deprecated": "core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/defs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", - "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", - "dev": true, - "dependencies": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" - }, - "bin": { - "defs": "build/es5/defs" - } - }, - "node_modules/detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "dev": true, - "dependencies": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - }, - "bin": { - "detect-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dev": true, - "dependencies": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "node_modules/detective/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "node_modules/domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.0.tgz", - "integrity": "sha512-oWPrF+7P1nGv/rw9oIInwdkmI1qediEJSvVfHFryBd8mWllCKB5tke3aKyf51J6chgyKmi6mODqdnin2yb88Nw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "node_modules/es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, - "node_modules/es6-set/node_modules/es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "dependencies": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/escope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dev": true, - "dependencies": { - "type": "^2.5.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true, - "engines": { - "node": "> 0.1.90" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/fs-readdir-recursive": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", - "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", - "dev": true, - "dependencies": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "node_modules/i": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", - "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherit": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.7.tgz", - "integrity": "sha512-dxJmC1j0Q32NFAjvbd6g3lXYLZ49HgzotgbSMwMkoiTXGhC9412Oc24g7A7M9cPPkw/vDsF2cSII+2zJwocUtQ==", - "dev": true - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", - "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-integer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", - "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { - "is-finite": "^1.0.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true, - "engines": { - "node": ">= 0.4" + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^10.12.0 || >=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "dependencies": { - "call-bind": "^1.0.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", - "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/jscs": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/jscs/-/jscs-2.11.0.tgz", - "integrity": "sha1-bhHvDKqgdzH53MKysn2OzuHdvLY=", - "deprecated": "JSCS has merged with ESLint! See - https://medium.com/@markelog/jscs-end-of-the-line-bc9bf0b3fdb2", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "dependencies": { - "babel-jscs": "^2.0.0", - "chalk": "~1.1.0", - "cli-table": "~0.3.1", - "commander": "~2.9.0", - "escope": "^3.2.0", - "esprima": "~2.7.0", - "estraverse": "^4.1.0", - "exit": "~0.1.2", - "glob": "^5.0.1", - "htmlparser2": "3.8.3", - "js-yaml": "~3.4.0", - "jscs-jsdoc": "^1.3.1", - "jscs-preset-wikimedia": "~1.0.0", - "jsonlint": "~1.6.2", - "lodash": "~3.10.0", - "minimatch": "~3.0.0", - "natural-compare": "~1.2.2", - "pathval": "~0.1.1", - "prompt": "~0.2.14", - "reserved-words": "^0.1.1", - "resolve": "^1.1.6", - "strip-bom": "^2.0.0", - "strip-json-comments": "~1.0.2", - "to-double-quotes": "^2.0.0", - "to-single-quotes": "^2.0.0", - "vow": "~0.4.8", - "vow-fs": "~0.3.4", - "xmlbuilder": "^3.1.0" - }, "bin": { - "jscs": "bin/jscs" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 0.10.0" + "node": ">=4" } }, - "node_modules/jscs-jsdoc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.3.2.tgz", - "integrity": "sha1-HyyCtqtLl1JNqVj0a05WLgMF+ac=", + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "dependencies": { - "comment-parser": "^0.3.1", - "jsdoctypeparser": "~1.2.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jscs-preset-wikimedia": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.1.tgz", - "integrity": "sha512-RWqu6IYSUlnYuCRCF0obCOHjJV0vhpLcvKbauwxmLQoZ0PiXDTWBYlfpsEfdhg7pmREAEwrARfDRz5qWD6qknA==", - "deprecated": "No longer maintained. We recomment migrating to ESLint with eslint-config-wikimedia.", - "dev": true - }, - "node_modules/jscs/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/jscs/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/jscs/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jscs/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" + "node": ">=4.0" } }, - "node_modules/jscs/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/jscs/node_modules/estraverse": { + "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", @@ -2431,257 +577,260 @@ "node": ">=4.0" } }, - "node_modules/jscs/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/jscs/node_modules/js-yaml": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz", - "integrity": "sha1-a+GyP2JJ9T0pM3D9TRqqY84bTrA=", - "dev": true, - "dependencies": { - "argparse": "^1.0.2", - "esprima": "^2.6.0", - "inherit": "^2.2.2" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, - "node_modules/jscs/node_modules/natural-compare": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz", - "integrity": "sha1-H5bWDjFBysG20FZTzg2urHY69qo=", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "node_modules/jscs/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=0.10.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/jscs/node_modules/strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "bin": { - "strip-json-comments": "cli.js" + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jscs/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jsdoctypeparser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", - "integrity": "sha1-597cFToRhJ/8UUEUSuhqfvDCU5I=", - "dev": true, - "dependencies": { - "lodash": "^3.7.0" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "node_modules/json-stable-stringify-without-jsonify": { + "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "node_modules/json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jsonlint": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz", - "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "JSV": "^4.0.x", - "nomnom": "^1.5.x" - }, - "bin": { - "jsonlint": "lib/cli.js" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 6" } }, - "node_modules/JSV": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", - "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", + "node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "invert-kv": "^1.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/leven": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", - "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, - "bin": { - "leven": "cli.js" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.19" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "node_modules/lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "node_modules/lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "node_modules/lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/lodash.clonedeep": { @@ -2690,56 +839,18 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, - "node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2764,164 +875,18 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node_modules/nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "deprecated": "Package no longer supported. Contact support@npmjs.com for more info.", - "dev": true, - "dependencies": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" - } - }, - "node_modules/nomnom/node_modules/ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nomnom/node_modules/chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "dependencies": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nomnom/node_modules/strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true, - "bin": { - "strip-ansi": "cli.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2948,38 +913,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2992,15 +925,6 @@ "node": ">=6" } }, - "node_modules/path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3019,27 +943,6 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/pathval": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", - "integrity": "sha1-CPkRzcqczllCiA2ngXvAtyO2bYI=", - "dev": true - }, - "node_modules/pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3049,21 +952,6 @@ "node": ">= 0.8.0" } }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -3073,22 +961,6 @@ "node": ">=0.4.0" } }, - "node_modules/prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", - "dev": true, - "dependencies": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" - }, - "engines": { - "node": ">= 0.6.6" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -3098,97 +970,6 @@ "node": ">=6" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/recast": { - "version": "0.10.33", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", - "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", - "dev": true, - "dependencies": { - "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerator": { - "version": "0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", - "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", - "dev": true, - "dependencies": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "recast": "0.10.33", - "through": "~2.3.8" - }, - "bin": { - "regenerator": "bin/regenerator" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -3201,103 +982,13 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/regexpu": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", - "dev": true, - "dependencies": { - "esprima": "^2.6.0", - "recast": "^0.10.10", - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - }, - "bin": { - "regexpu": "bin/regexpu" - } - }, - "node_modules/regexpu/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "bin": { - "repeating": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", - "dev": true - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/resolve-from": { @@ -3309,27 +1000,6 @@ "node": ">=4" } }, - "node_modules/revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3345,18 +1015,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -3393,41 +1051,6 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", - "dev": true - }, - "node_modules/simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", - "dev": true - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -3445,139 +1068,38 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "dev": true, - "dependencies": { - "source-map": "0.1.32" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", - "dev": true - }, - "node_modules/stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", - "dev": true - }, "node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3596,379 +1118,109 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/to-double-quotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz", - "integrity": "sha1-qvIx1vqUiUn4GTAburRITYWI5Kc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-single-quotes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.1.tgz", - "integrity": "sha1-fMKRUfD18sQZRvEZ9ZMv5VQXASU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/try-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", - "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", - "dev": true - }, - "node_modules/tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true, - "bin": { - "user-home": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", - "dev": true, - "dependencies": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - }, - "engines": { - "node": ">= 0.6.4" - } - }, - "node_modules/utile/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vow": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.20.tgz", - "integrity": "sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vow-fs": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", - "integrity": "sha1-LUxZviLivyYY3fWXq0uqkjvnIA0=", - "dev": true, - "dependencies": { - "glob": "^7.0.5", - "uuid": "^2.0.2", - "vow": "^0.4.7", - "vow-queue": "^0.4.1" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/vow-queue": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.3.tgz", - "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", - "dev": true, - "dependencies": { - "vow": "^0.4.17" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 8" + "node": ">=10.0.0" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", "dev": true, "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, - "node_modules/which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "bin": { - "window-size": "cli.js" - }, "engines": { - "node": ">= 0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" - }, - "engines": { - "node": ">= 0.6.0" + "punycode": "^2.1.0" } }, - "node_modules/winston/node_modules/colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true, - "engines": { - "node": ">=0.1.90" - } + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, - "node_modules/winston/node_modules/pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 8" } }, "node_modules/word-wrap": { @@ -3980,58 +1232,17 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "node_modules/xmlbuilder": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", - "integrity": "sha1-LIaIjy1OrehQ+jjKf3Ij9yCVFuE=", - "dev": true, - "dependencies": { - "lodash": "^3.5.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true - }, - "node_modules/yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", - "dev": true, - "dependencies": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } } }, "dependencies": { @@ -4045,9 +1256,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/highlight": { @@ -4161,363 +1372,57 @@ }, "acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", - "dev": true, - "requires": { - "stable": "~0.1.3" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "ast-traverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", - "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", - "dev": true - }, - "ast-types": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", - "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "babel-core": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", - "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", - "dev": true, - "requires": { - "babel-plugin-constant-folding": "^1.0.1", - "babel-plugin-dead-code-elimination": "^1.0.2", - "babel-plugin-eval": "^1.0.1", - "babel-plugin-inline-environment-variables": "^1.0.1", - "babel-plugin-jscript": "^1.0.4", - "babel-plugin-member-expression-literals": "^1.0.1", - "babel-plugin-property-literals": "^1.0.1", - "babel-plugin-proto-to-assign": "^1.0.3", - "babel-plugin-react-constant-elements": "^1.0.3", - "babel-plugin-react-display-name": "^1.0.3", - "babel-plugin-remove-console": "^1.0.1", - "babel-plugin-remove-debugger": "^1.0.1", - "babel-plugin-runtime": "^1.0.7", - "babel-plugin-undeclared-variables-check": "^1.0.2", - "babel-plugin-undefined-to-void": "^1.1.6", - "babylon": "^5.8.38", - "bluebird": "^2.9.33", - "chalk": "^1.0.0", - "convert-source-map": "^1.1.0", - "core-js": "^1.0.0", - "debug": "^2.1.1", - "detect-indent": "^3.0.0", - "esutils": "^2.0.0", - "fs-readdir-recursive": "^0.1.0", - "globals": "^6.4.0", - "home-or-tmp": "^1.0.0", - "is-integer": "^1.0.4", - "js-tokens": "1.0.1", - "json5": "^0.4.0", - "lodash": "^3.10.0", - "minimatch": "^2.0.3", - "output-file-sync": "^1.1.0", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", - "regenerator": "0.8.40", - "regexpu": "^1.3.0", - "repeating": "^1.1.2", - "resolve": "^1.1.6", - "shebang-regex": "^1.0.0", - "slash": "^1.0.0", - "source-map": "^0.5.0", - "source-map-support": "^0.2.10", - "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0", - "try-resolve": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "globals": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", - "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", - "dev": true - }, - "js-tokens": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", - "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-jscs": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", - "integrity": "sha1-CjRwRrSBRay8pW6MjtX3NrxU+dA=", - "dev": true, - "requires": { - "babel-core": "~5.8.3", - "lodash.assign": "^3.2.0" - } - }, - "babel-plugin-constant-folding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", - "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", - "dev": true - }, - "babel-plugin-dead-code-elimination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", - "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", - "dev": true - }, - "babel-plugin-eval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", - "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", - "dev": true - }, - "babel-plugin-inline-environment-variables": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", - "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", - "dev": true - }, - "babel-plugin-jscript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", - "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", - "dev": true - }, - "babel-plugin-member-expression-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", - "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", - "dev": true - }, - "babel-plugin-property-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", - "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", - "dev": true + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, - "babel-plugin-proto-to-assign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", - "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "lodash": "^3.9.3" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "babel-plugin-react-constant-elements": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", - "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", - "dev": true - }, - "babel-plugin-react-display-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", - "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", - "dev": true - }, - "babel-plugin-remove-console": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", - "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", - "dev": true - }, - "babel-plugin-remove-debugger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", - "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "babel-plugin-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", - "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, - "babel-plugin-undeclared-variables-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", - "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "leven": "^1.0.2" + "color-convert": "^2.0.1" } }, - "babel-plugin-undefined-to-void": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", - "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", - "dev": true + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } }, - "babylon": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", - "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "balanced-match": { @@ -4526,12 +1431,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4542,44 +1441,12 @@ "concat-map": "0.0.1" } }, - "breakable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", - "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4590,26 +1457,6 @@ "supports-color": "^7.1.0" } }, - "cli-table": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", - "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4625,145 +1472,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "comment-parser": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.2.tgz", - "integrity": "sha1-PAPwd2uGo239mgosl8YwfzMggv4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", - "dev": true, - "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "dependencies": { - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - } - } - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4775,22 +1489,6 @@ "which": "^2.0.1" } }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -4800,111 +1498,12 @@ "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "defs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", - "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", - "dev": true, - "requires": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" - } - }, - "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - } - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dev": true, - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4914,55 +1513,6 @@ "esutils": "^2.0.2" } }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4975,187 +1525,15 @@ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "es-abstract": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.0.tgz", - "integrity": "sha512-oWPrF+7P1nGv/rw9oIInwdkmI1qediEJSvVfHFryBd8mWllCKB5tke3aKyf51J6chgyKmi6mODqdnin2yb88Nw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - }, - "dependencies": { - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - } - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } + "ansi-colors": "^4.1.1" } }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -5202,14 +1580,6 @@ "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } } }, "eslint-scope": { @@ -5220,14 +1590,6 @@ "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } } }, "eslint-utils": { @@ -5237,12 +1599,20 @@ "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { @@ -5254,6 +1624,14 @@ "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -5262,12 +1640,6 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", - "dev": true - }, "esquery": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", @@ -5275,6 +1647,14 @@ "dev": true, "requires": { "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "esrecurse": { @@ -5284,12 +1664,20 @@ "dev": true, "requires": { "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { @@ -5298,45 +1686,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "dev": true, - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", - "dev": true - } - } - }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5380,479 +1729,121 @@ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "fs-readdir-recursive": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", - "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" - } - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "i": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", - "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherit": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.7.tgz", - "integrity": "sha512-dxJmC1j0Q32NFAjvbd6g3lXYLZ49HgzotgbSMwMkoiTXGhC9412Oc24g7A7M9cPPkw/vDsF2cSII+2zJwocUtQ==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", - "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } + "dev": true }, - "is-integer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", - "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { - "is-finite": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "is-glob": "^4.0.1" } }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "type-fest": "^0.20.2" } }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, - "is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-weakref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", - "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "is-extglob": "^2.1.1" } }, - "is-weakset": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", - "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5869,169 +1860,6 @@ "esprima": "^4.0.0" } }, - "jscs": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/jscs/-/jscs-2.11.0.tgz", - "integrity": "sha1-bhHvDKqgdzH53MKysn2OzuHdvLY=", - "dev": true, - "requires": { - "babel-jscs": "^2.0.0", - "chalk": "~1.1.0", - "cli-table": "~0.3.1", - "commander": "~2.9.0", - "escope": "^3.2.0", - "esprima": "~2.7.0", - "estraverse": "^4.1.0", - "exit": "~0.1.2", - "glob": "^5.0.1", - "htmlparser2": "3.8.3", - "js-yaml": "~3.4.0", - "jscs-jsdoc": "^1.3.1", - "jscs-preset-wikimedia": "~1.0.0", - "jsonlint": "~1.6.2", - "lodash": "~3.10.0", - "minimatch": "~3.0.0", - "natural-compare": "~1.2.2", - "pathval": "~0.1.1", - "prompt": "~0.2.14", - "reserved-words": "^0.1.1", - "resolve": "^1.1.6", - "strip-bom": "^2.0.0", - "strip-json-comments": "~1.0.2", - "to-double-quotes": "^2.0.0", - "to-single-quotes": "^2.0.0", - "vow": "~0.4.8", - "vow-fs": "~0.3.4", - "xmlbuilder": "^3.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz", - "integrity": "sha1-a+GyP2JJ9T0pM3D9TRqqY84bTrA=", - "dev": true, - "requires": { - "argparse": "^1.0.2", - "esprima": "^2.6.0", - "inherit": "^2.2.2" - } - }, - "natural-compare": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz", - "integrity": "sha1-H5bWDjFBysG20FZTzg2urHY69qo=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "jscs-jsdoc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.3.2.tgz", - "integrity": "sha1-HyyCtqtLl1JNqVj0a05WLgMF+ac=", - "dev": true, - "requires": { - "comment-parser": "^0.3.1", - "jsdoctypeparser": "~1.2.0" - } - }, - "jscs-preset-wikimedia": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.1.tgz", - "integrity": "sha512-RWqu6IYSUlnYuCRCF0obCOHjJV0vhpLcvKbauwxmLQoZ0PiXDTWBYlfpsEfdhg7pmREAEwrARfDRz5qWD6qknA==", - "dev": true - }, - "jsdoctypeparser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", - "integrity": "sha1-597cFToRhJ/8UUEUSuhqfvDCU5I=", - "dev": true, - "requires": { - "lodash": "^3.7.0" - } - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6044,58 +1872,6 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", - "dev": true - }, - "jsonlint": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.3.tgz", - "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", - "dev": true, - "requires": { - "JSV": "^4.0.x", - "nomnom": "^1.5.x" - } - }, - "JSV": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", - "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "leven": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", - "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", - "dev": true - }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6106,121 +1882,24 @@ "type-check": "~0.4.0" } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6239,125 +1918,17 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "dev": true, - "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "once": { "version": "1.4.0", @@ -6382,32 +1953,6 @@ "word-wrap": "^1.2.3" } }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6417,12 +1962,6 @@ "callsites": "^3.0.0" } }, - "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -6435,236 +1974,42 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "pathval": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", - "integrity": "sha1-CPkRzcqczllCiA2ngXvAtyO2bYI=", - "dev": true - }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", - "dev": true - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", - "dev": true, - "requires": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "recast": { - "version": "0.10.33", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", - "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", - "dev": true, - "requires": { - "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerator": { - "version": "0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", - "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", - "dev": true, - "requires": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "recast": "0.10.33", - "through": "~2.3.8" - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "regexpu": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", - "dev": true, - "requires": { - "esprima": "^2.6.0", - "recast": "^0.10.10", - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, - "reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha1-AKCUD5jNUBrqqsMWQR2a3FKzGrE=", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6674,18 +2019,6 @@ "glob": "^7.1.3" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -6710,35 +2043,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", - "dev": true - }, - "simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -6750,115 +2054,30 @@ "is-fullwidth-code-point": "^3.0.0" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "dev": true, - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "strip-ansi": "^6.0.1" } }, - "stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", - "dev": true - }, - "stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", - "dev": true - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "ansi-regex": "^5.0.1" } }, "strip-json-comments": { @@ -6877,17 +2096,17 @@ } }, "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", "dev": true, "requires": { "ajv": "^8.0.1", "lodash.clonedeep": "^4.5.0", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { "ajv": { @@ -6916,54 +2135,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "to-double-quotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz", - "integrity": "sha1-qvIx1vqUiUn4GTAburRITYWI5Kc=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-single-quotes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.1.tgz", - "integrity": "sha1-fMKRUfD18sQZRvEZ9ZMv5VQXASU=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "try-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", - "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", - "dev": true - }, - "tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", - "dev": true - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6979,24 +2150,6 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7006,82 +2159,12 @@ "punycode": "^2.1.0" } }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", - "dev": true, - "requires": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "vow": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.20.tgz", - "integrity": "sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ==", - "dev": true - }, - "vow-fs": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", - "integrity": "sha1-LUxZviLivyYY3fWXq0uqkjvnIA0=", - "dev": true, - "requires": { - "glob": "^7.0.5", - "uuid": "^2.0.2", - "vow": "^0.4.7", - "vow-queue": "^0.4.1" - } - }, - "vow-queue": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.3.tgz", - "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", - "dev": true, - "requires": { - "vow": "^0.4.17" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7091,132 +2174,23 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", - "dev": true, - "requires": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", - "dev": true - } - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xmlbuilder": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", - "integrity": "sha1-LIaIjy1OrehQ+jjKf3Ij9yCVFuE=", - "dev": true, - "requires": { - "lodash": "^3.5.0" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true - }, - "yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", - "dev": true, - "requires": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } } } } diff --git a/package.json b/package.json index dba7339e..4aeec6d0 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,11 @@ "description": "", "main": "eslint/.eslintrc", "scripts": { - "eslint": "./node_modules/.bin/eslint -c eslint/.eslintrc --rulesdir eslint/rules", - "jscs": "./node_modules/.bin/jscs -c jscs/.jscsrc" + "eslint": "./node_modules/.bin/eslint -c eslint/.eslintrc --rulesdir eslint/rules" }, "author": "", "license": "ISC", "devDependencies": { - "eslint": "^7.32.0", - "jscs": "^2.1.1" + "eslint": "^7.32.0" } } From 6f94d87e2b7222e402877eb0c6cb8b1cc4e06f9e Mon Sep 17 00:00:00 2001 From: Sergii Ivashchenko Date: Fri, 29 Oct 2021 19:12:36 +0100 Subject: [PATCH 99/99] AC-1314: Added copyright verification for graphqls files --- .../CopyrightAnotherExtensionsFilesSniff.php | 8 +-- .../Sniffs/Header/CopyrightGraphQLSniff.php | 57 +++++++++++++++++++ .../Sniffs/Header/LicenseSniff.php | 5 +- .../CopyrightGraphQLUnitTest.1.graphqls | 34 +++++++++++ .../CopyrightGraphQLUnitTest.2.graphqls | 34 +++++++++++ .../CopyrightGraphQLUnitTest.3.graphqls | 34 +++++++++++ .../CopyrightGraphQLUnitTest.4.graphqls | 31 ++++++++++ .../Tests/Header/CopyrightGraphQLUnitTest.php | 37 ++++++++++++ Magento2Framework/ruleset.xml | 12 ++++ 9 files changed, 245 insertions(+), 7 deletions(-) create mode 100644 Magento2Framework/Sniffs/Header/CopyrightGraphQLSniff.php create mode 100644 Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.1.graphqls create mode 100644 Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.2.graphqls create mode 100644 Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.3.graphqls create mode 100644 Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.4.graphqls create mode 100644 Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.php diff --git a/Magento2Framework/Sniffs/Header/CopyrightAnotherExtensionsFilesSniff.php b/Magento2Framework/Sniffs/Header/CopyrightAnotherExtensionsFilesSniff.php index bfc36afe..3bafbb1f 100644 --- a/Magento2Framework/Sniffs/Header/CopyrightAnotherExtensionsFilesSniff.php +++ b/Magento2Framework/Sniffs/Header/CopyrightAnotherExtensionsFilesSniff.php @@ -7,7 +7,6 @@ namespace Magento2Framework\Sniffs\Header; -use Magento2\Sniffs\Less\TokenizerSymbolsInterface; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; @@ -23,7 +22,7 @@ class CopyrightAnotherExtensionsFilesSniff implements Sniff * * @var array */ - public $supportedTokenizers = [TokenizerSymbolsInterface::TOKENIZER_CSS, 'PHP']; + public $supportedTokenizers = ['CSS', 'PHP', 'JS']; /** * @inheritDoc @@ -46,9 +45,10 @@ public function process(File $phpcsFile, $stackPtr) } $fileText = $phpcsFile->getTokensAsString($stackPtr, count($phpcsFile->getTokens())); - $adobeCopyrightFound = preg_match(self::COPYRIGHT_ADOBE, $fileText); - if (strpos($fileText, self::COPYRIGHT_MAGENTO_TEXT) !== false || $adobeCopyrightFound) { + if (strpos($fileText, self::COPYRIGHT_MAGENTO_TEXT) !== false + || preg_match(self::COPYRIGHT_ADOBE, $fileText) + ) { return; } diff --git a/Magento2Framework/Sniffs/Header/CopyrightGraphQLSniff.php b/Magento2Framework/Sniffs/Header/CopyrightGraphQLSniff.php new file mode 100644 index 00000000..1e488e69 --- /dev/null +++ b/Magento2Framework/Sniffs/Header/CopyrightGraphQLSniff.php @@ -0,0 +1,57 @@ +findPrevious(T_OPEN_TAG, $stackPtr - 1) !== false) { + return; + } + + // @phpcs:ignore Magento2.Functions.DiscouragedFunction.Discouraged + $content = file_get_contents($phpcsFile->getFilename()); + + if (strpos($content, self::COPYRIGHT_MAGENTO_TEXT) !== false || preg_match(self::COPYRIGHT_ADOBE, $content)) { + return; + } + + $phpcsFile->addWarningOnLine( + 'Copyright is missing or has wrong format', + null, + self::WARNING_CODE + ); + } +} diff --git a/Magento2Framework/Sniffs/Header/LicenseSniff.php b/Magento2Framework/Sniffs/Header/LicenseSniff.php index 667b3b2b..cf7a5479 100644 --- a/Magento2Framework/Sniffs/Header/LicenseSniff.php +++ b/Magento2Framework/Sniffs/Header/LicenseSniff.php @@ -7,7 +7,6 @@ namespace Magento2Framework\Sniffs\Header; -use Magento2\Sniffs\Less\TokenizerSymbolsInterface; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; @@ -18,7 +17,7 @@ class LicenseSniff implements Sniff * * @var array */ - public $supportedTokenizers = [TokenizerSymbolsInterface::TOKENIZER_CSS, 'PHP']; + public $supportedTokenizers = ['CSS', 'PHP']; private const WARNING_CODE = 'FoundLegacyTextInCopyright'; @@ -49,7 +48,7 @@ public function process(File $phpcsFile, $stackPtr) if ($tokens[$stackPtr]['code'] === T_INLINE_HTML) { $content = $phpcsFile->getTokensAsString($stackPtr, 1); } - if ($content != null) { + if ($content !== null) { $this->checkLicense($content, $stackPtr, $phpcsFile); } } diff --git a/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.1.graphqls b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.1.graphqls new file mode 100644 index 00000000..6d212f25 --- /dev/null +++ b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.1.graphqls @@ -0,0 +1,34 @@ +# Copyright © Magento, Inc. All rights reserved. +# See COPYING.txt for license details. + +enum PriceAdjustmentCodesEnum { + WEEE @deprecated(reason: "WEEE code is deprecated, use fixed_product_taxes.label") + WEEE_TAX @deprecated(reason: "Use fixed_product_taxes. PriceAdjustmentCodesEnum is deprecated. Tax is included or excluded in price. Tax is not shown separtely in Catalog") +} + +type ProductPrice { + fixed_product_taxes: [FixedProductTax] @doc(description: "The multiple FPTs that can be applied to a product price.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\FixedProductTax") +} + +type CartItemPrices { + fixed_product_taxes: [FixedProductTax] @doc(description: "Applied FPT to the cart item.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\Quote\\FixedProductTax") +} + +type FixedProductTax @doc(description: "A single FPT that can be applied to a product price.") { + amount: Money @doc(description: "Amount of the FPT as a money object.") + label: String @doc(description: "The label assigned to the FPT to be displayed on the frontend.") +} + +type StoreConfig { + product_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices On Product View Page' field. It indicates how FPT information is displayed on product pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + category_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Product Lists' field. It indicates how FPT information is displayed on category pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + sales_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Sales Modules' field. It indicates how FPT information is displayed on cart, checkout, and order pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") +} + +enum FixedProductTaxDisplaySettings @doc(description: "This enumeration display settings for the fixed product tax") { + INCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price includes the FPT amount without displaying the ProductPrice.fixed_product_taxes values. This value corresponds to 'Including FPT only'") + INCLUDE_FPT_WITH_DETAILS @doc(description: "The displayed price includes the FPT amount while displaying the values of ProductPrice.fixed_product_taxes separately. This value corresponds to 'Including FPT and FPT description'") + EXCLUDE_FPT_AND_INCLUDE_WITH_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values of ProductPrice.fixed_product_taxes and the price including the FPT are displayed separately. This value corresponds to 'Excluding FPT, Including FPT description and final price'") + EXCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values from ProductPrice.fixed_product_taxes are not displayed. This value corresponds to 'Excluding FPT'") + FPT_DISABLED @doc(description: "The FPT feature is not enabled. You can omit ProductPrice.fixed_product_taxes from your query") +} diff --git a/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.2.graphqls b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.2.graphqls new file mode 100644 index 00000000..786f22ca --- /dev/null +++ b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.2.graphqls @@ -0,0 +1,34 @@ +# Copyright 2020 Adobe +# See COPYING.txt for license details. + +enum PriceAdjustmentCodesEnum { + WEEE @deprecated(reason: "WEEE code is deprecated, use fixed_product_taxes.label") + WEEE_TAX @deprecated(reason: "Use fixed_product_taxes. PriceAdjustmentCodesEnum is deprecated. Tax is included or excluded in price. Tax is not shown separtely in Catalog") +} + +type ProductPrice { + fixed_product_taxes: [FixedProductTax] @doc(description: "The multiple FPTs that can be applied to a product price.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\FixedProductTax") +} + +type CartItemPrices { + fixed_product_taxes: [FixedProductTax] @doc(description: "Applied FPT to the cart item.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\Quote\\FixedProductTax") +} + +type FixedProductTax @doc(description: "A single FPT that can be applied to a product price.") { + amount: Money @doc(description: "Amount of the FPT as a money object.") + label: String @doc(description: "The label assigned to the FPT to be displayed on the frontend.") +} + +type StoreConfig { + product_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices On Product View Page' field. It indicates how FPT information is displayed on product pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + category_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Product Lists' field. It indicates how FPT information is displayed on category pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + sales_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Sales Modules' field. It indicates how FPT information is displayed on cart, checkout, and order pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") +} + +enum FixedProductTaxDisplaySettings @doc(description: "This enumeration display settings for the fixed product tax") { + INCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price includes the FPT amount without displaying the ProductPrice.fixed_product_taxes values. This value corresponds to 'Including FPT only'") + INCLUDE_FPT_WITH_DETAILS @doc(description: "The displayed price includes the FPT amount while displaying the values of ProductPrice.fixed_product_taxes separately. This value corresponds to 'Including FPT and FPT description'") + EXCLUDE_FPT_AND_INCLUDE_WITH_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values of ProductPrice.fixed_product_taxes and the price including the FPT are displayed separately. This value corresponds to 'Excluding FPT, Including FPT description and final price'") + EXCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values from ProductPrice.fixed_product_taxes are not displayed. This value corresponds to 'Excluding FPT'") + FPT_DISABLED @doc(description: "The FPT feature is not enabled. You can omit ProductPrice.fixed_product_taxes from your query") +} diff --git a/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.3.graphqls b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.3.graphqls new file mode 100644 index 00000000..6706a8b2 --- /dev/null +++ b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.3.graphqls @@ -0,0 +1,34 @@ +# Copyright 2020 Magento +# See COPYING.txt for license details. + +enum PriceAdjustmentCodesEnum { + WEEE @deprecated(reason: "WEEE code is deprecated, use fixed_product_taxes.label") + WEEE_TAX @deprecated(reason: "Use fixed_product_taxes. PriceAdjustmentCodesEnum is deprecated. Tax is included or excluded in price. Tax is not shown separtely in Catalog") +} + +type ProductPrice { + fixed_product_taxes: [FixedProductTax] @doc(description: "The multiple FPTs that can be applied to a product price.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\FixedProductTax") +} + +type CartItemPrices { + fixed_product_taxes: [FixedProductTax] @doc(description: "Applied FPT to the cart item.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\Quote\\FixedProductTax") +} + +type FixedProductTax @doc(description: "A single FPT that can be applied to a product price.") { + amount: Money @doc(description: "Amount of the FPT as a money object.") + label: String @doc(description: "The label assigned to the FPT to be displayed on the frontend.") +} + +type StoreConfig { + product_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices On Product View Page' field. It indicates how FPT information is displayed on product pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + category_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Product Lists' field. It indicates how FPT information is displayed on category pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + sales_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Sales Modules' field. It indicates how FPT information is displayed on cart, checkout, and order pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") +} + +enum FixedProductTaxDisplaySettings @doc(description: "This enumeration display settings for the fixed product tax") { + INCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price includes the FPT amount without displaying the ProductPrice.fixed_product_taxes values. This value corresponds to 'Including FPT only'") + INCLUDE_FPT_WITH_DETAILS @doc(description: "The displayed price includes the FPT amount while displaying the values of ProductPrice.fixed_product_taxes separately. This value corresponds to 'Including FPT and FPT description'") + EXCLUDE_FPT_AND_INCLUDE_WITH_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values of ProductPrice.fixed_product_taxes and the price including the FPT are displayed separately. This value corresponds to 'Excluding FPT, Including FPT description and final price'") + EXCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values from ProductPrice.fixed_product_taxes are not displayed. This value corresponds to 'Excluding FPT'") + FPT_DISABLED @doc(description: "The FPT feature is not enabled. You can omit ProductPrice.fixed_product_taxes from your query") +} diff --git a/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.4.graphqls b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.4.graphqls new file mode 100644 index 00000000..c685a931 --- /dev/null +++ b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.4.graphqls @@ -0,0 +1,31 @@ +enum PriceAdjustmentCodesEnum { + WEEE @deprecated(reason: "WEEE code is deprecated, use fixed_product_taxes.label") + WEEE_TAX @deprecated(reason: "Use fixed_product_taxes. PriceAdjustmentCodesEnum is deprecated. Tax is included or excluded in price. Tax is not shown separtely in Catalog") +} + +type ProductPrice { + fixed_product_taxes: [FixedProductTax] @doc(description: "The multiple FPTs that can be applied to a product price.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\FixedProductTax") +} + +type CartItemPrices { + fixed_product_taxes: [FixedProductTax] @doc(description: "Applied FPT to the cart item.") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\Quote\\FixedProductTax") +} + +type FixedProductTax @doc(description: "A single FPT that can be applied to a product price.") { + amount: Money @doc(description: "Amount of the FPT as a money object.") + label: String @doc(description: "The label assigned to the FPT to be displayed on the frontend.") +} + +type StoreConfig { + product_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices On Product View Page' field. It indicates how FPT information is displayed on product pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + category_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Product Lists' field. It indicates how FPT information is displayed on category pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") + sales_fixed_product_tax_display_setting : FixedProductTaxDisplaySettings @doc(description: "Corresponds to the 'Display Prices In Sales Modules' field. It indicates how FPT information is displayed on cart, checkout, and order pages") @resolver(class: "Magento\\WeeeGraphQl\\Model\\Resolver\\StoreConfig") +} + +enum FixedProductTaxDisplaySettings @doc(description: "This enumeration display settings for the fixed product tax") { + INCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price includes the FPT amount without displaying the ProductPrice.fixed_product_taxes values. This value corresponds to 'Including FPT only'") + INCLUDE_FPT_WITH_DETAILS @doc(description: "The displayed price includes the FPT amount while displaying the values of ProductPrice.fixed_product_taxes separately. This value corresponds to 'Including FPT and FPT description'") + EXCLUDE_FPT_AND_INCLUDE_WITH_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values of ProductPrice.fixed_product_taxes and the price including the FPT are displayed separately. This value corresponds to 'Excluding FPT, Including FPT description and final price'") + EXCLUDE_FPT_WITHOUT_DETAILS @doc(description: "The displayed price does not include the FPT amount. The values from ProductPrice.fixed_product_taxes are not displayed. This value corresponds to 'Excluding FPT'") + FPT_DISABLED @doc(description: "The FPT feature is not enabled. You can omit ProductPrice.fixed_product_taxes from your query") +} diff --git a/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.php b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.php new file mode 100644 index 00000000..7cd23950 --- /dev/null +++ b/Magento2Framework/Tests/Header/CopyrightGraphQLUnitTest.php @@ -0,0 +1,37 @@ + 1 + ]; + } + + return []; + } +} diff --git a/Magento2Framework/ruleset.xml b/Magento2Framework/ruleset.xml index 434d10cc..80369df8 100644 --- a/Magento2Framework/ruleset.xml +++ b/Magento2Framework/ruleset.xml @@ -1,6 +1,9 @@ Magento Coding Standard sniffs applicable for the framework testing only + + + 5 warning @@ -17,4 +20,13 @@ *\.php$ *\.phtml$ + + 5 + warning + *\.graphqls$ + + + + 0 +