diff --git a/eslint.config.mjs b/eslint.config.mjs index f3350b3..b820425 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -2,25 +2,32 @@ import globals from 'globals' import pluginJs from '@eslint/js' import eslintPlugin from 'eslint-plugin-eslint-plugin' import mochaPlugin from 'eslint-plugin-mocha' +import stylistic from '@stylistic/eslint-plugin' export default [ pluginJs.configs.recommended, eslintPlugin.configs['flat/recommended'], mochaPlugin.configs.recommended, - {ignores: ['test-project/']}, + stylistic.configs.recommended, + { ignores: ['test-project/'] }, { languageOptions: { - globals: globals.node + globals: globals.node, }, rules: { 'no-redeclare': 'off', + '@stylistic/arrow-parens': ['error', 'always'], + '@stylistic/indent': ['error', 2], + '@stylistic/comma-dangle': ['error', 'always-multiline'], + '@stylistic/quotes': ['error', 'single'], + '@stylistic/semi': ['error', 'never'], 'eslint-plugin/require-meta-docs-url': - ['error', { 'pattern': 'https://github.com/cypress-io/eslint-plugin-cypress/blob/master/docs/rules/{{name}}.md' }], + ['error', { pattern: 'https://github.com/cypress-io/eslint-plugin-cypress/blob/master/docs/rules/{{name}}.md' }], 'eslint-plugin/require-meta-docs-description': 'error', 'eslint-plugin/meta-property-ordering': 'error', 'eslint-plugin/test-case-property-ordering': 'error', 'mocha/no-mocha-arrows': 'off', - 'mocha/no-setup-in-describe': 'off' - } + 'mocha/no-setup-in-describe': 'off', + }, }, ] diff --git a/lib/flat.js b/lib/flat.js index a3e2d4c..0894f73 100644 --- a/lib/flat.js +++ b/lib/flat.js @@ -20,8 +20,8 @@ const plugin = { }, } -const commonGlobals = - Object.assign({ +const commonGlobals + = Object.assign({ cy: false, Cypress: false, expect: false, @@ -33,20 +33,20 @@ Object.assign(plugin.configs, { globals: { name: 'cypress/globals', plugins: { - cypress: plugin + cypress: plugin, }, languageOptions: { globals: commonGlobals, - } - } + }, + }, }) Object.assign(plugin.configs, { recommended: { name: 'cypress/recommended', plugins: { - cypress: plugin + cypress: plugin, }, rules: { 'cypress/no-assigning-return-values': 'error', @@ -57,8 +57,8 @@ Object.assign(plugin.configs, { languageOptions: { globals: commonGlobals, - } - } + }, + }, }) module.exports = plugin diff --git a/lib/rules/assertion-before-screenshot.js b/lib/rules/assertion-before-screenshot.js index 52d0e32..f446bc1 100644 --- a/lib/rules/assertion-before-screenshot.js +++ b/lib/rules/assertion-before-screenshot.js @@ -28,9 +28,9 @@ module.exports = { unexpected: 'Make an assertion on the page state before taking a screenshot', }, }, - create (context) { + create(context) { return { - CallExpression (node) { + CallExpression(node) { if (isCallingCyScreenshot(node) && !isPreviousAnAssertion(node)) { context.report({ node, messageId: 'unexpected' }) } @@ -39,12 +39,12 @@ module.exports = { }, } -function isRootCypress (node) { +function isRootCypress(node) { while (node.type === 'CallExpression') { if (node.callee.type !== 'MemberExpression') return false - if (node.callee.object.type === 'Identifier' && - node.callee.object.name === 'cy') { + if (node.callee.object.type === 'Identifier' + && node.callee.object.name === 'cy') { return true } @@ -54,26 +54,26 @@ function isRootCypress (node) { return false } -function getPreviousInChain (node) { - return node.type === 'CallExpression' && - node.callee.type === 'MemberExpression' && - node.callee.object.type === 'CallExpression' && - node.callee.object.callee.type === 'MemberExpression' && - node.callee.object.callee.property.type === 'Identifier' && - node.callee.object.callee.property.name +function getPreviousInChain(node) { + return node.type === 'CallExpression' + && node.callee.type === 'MemberExpression' + && node.callee.object.type === 'CallExpression' + && node.callee.object.callee.type === 'MemberExpression' + && node.callee.object.callee.property.type === 'Identifier' + && node.callee.object.callee.property.name } -function getCallExpressionCypressCommand (node) { - return isRootCypress(node) && - node.callee.property.type === 'Identifier' && - node.callee.property.name +function getCallExpressionCypressCommand(node) { + return isRootCypress(node) + && node.callee.property.type === 'Identifier' + && node.callee.property.name } -function isCallingCyScreenshot (node) { +function isCallingCyScreenshot(node) { return getCallExpressionCypressCommand(node) === 'screenshot' } -function getPreviousCypressCommand (node) { +function getPreviousCypressCommand(node) { const previousInChain = getPreviousInChain(node) if (previousInChain) { @@ -97,15 +97,15 @@ function getPreviousCypressCommand (node) { const previousStatement = body[index - 1] - if (previousStatement.type !== 'ExpressionStatement' || - previousStatement.expression.type !== 'CallExpression') { + if (previousStatement.type !== 'ExpressionStatement' + || previousStatement.expression.type !== 'CallExpression') { return null } return getCallExpressionCypressCommand(previousStatement.expression) } -function isPreviousAnAssertion (node) { +function isPreviousAnAssertion(node) { const previousCypressCommand = getPreviousCypressCommand(node) return assertionCommands.indexOf(previousCypressCommand) >= 0 diff --git a/lib/rules/no-assigning-return-values.js b/lib/rules/no-assigning-return-values.js index 36055a9..ed1e130 100644 --- a/lib/rules/no-assigning-return-values.js +++ b/lib/rules/no-assigning-return-values.js @@ -1,7 +1,7 @@ 'use strict' // safely get nested object property -function get (obj, propertyString = '') { +function get(obj, propertyString = '') { const properties = propertyString.split('.') for (let i = 0; i < properties.length; i++) { @@ -29,9 +29,9 @@ module.exports = { unexpected: 'Do not assign the return value of a Cypress command', }, }, - create (context) { + create(context) { return { - VariableDeclaration (node) { + VariableDeclaration(node) { if (node.declarations.some(isCypressCommandDeclaration)) { context.report({ node, messageId: 'unexpected' }) } @@ -47,7 +47,7 @@ const allowedCommands = { stub: true, } -function isCypressCommandDeclaration (declarator) { +function isCypressCommandDeclaration(declarator) { let object = get(declarator, 'init.callee.object') if (!object) return diff --git a/lib/rules/no-async-before.js b/lib/rules/no-async-before.js index aa42854..f1f9615 100644 --- a/lib/rules/no-async-before.js +++ b/lib/rules/no-async-before.js @@ -15,31 +15,31 @@ module.exports = { }, }, - create (context) { - function isBeforeBlock (callExpressionNode) { + create(context) { + function isBeforeBlock(callExpressionNode) { const { type, name } = callExpressionNode.callee return type === 'Identifier' - && name === 'before' || name === 'beforeEach' + && (name === 'before' || name === 'beforeEach') } - function isBeforeAsync (node) { + function isBeforeAsync(node) { return node.arguments - && node.arguments.length >= 2 - && node.arguments[1].async === true + && node.arguments.length >= 2 + && node.arguments[1].async === true } const sourceCode = context.sourceCode ?? context.getSourceCode() return { - Identifier (node) { + Identifier(node) { if (node.name === 'cy' || node.name === 'Cypress') { const ancestors = sourceCode.getAncestors ? sourceCode.getAncestors(node) : context.getAncestors() const asyncTestBlocks = ancestors - .filter((n) => n.type === 'CallExpression') - .filter(isBeforeBlock) - .filter(isBeforeAsync) + .filter((n) => n.type === 'CallExpression') + .filter(isBeforeBlock) + .filter(isBeforeAsync) if (asyncTestBlocks.length >= 1) { asyncTestBlocks.forEach((node) => { diff --git a/lib/rules/no-async-tests.js b/lib/rules/no-async-tests.js index 5d1ca28..e16febb 100644 --- a/lib/rules/no-async-tests.js +++ b/lib/rules/no-async-tests.js @@ -15,31 +15,31 @@ module.exports = { }, }, - create (context) { - function isTestBlock (callExpressionNode) { + create(context) { + function isTestBlock(callExpressionNode) { const { type, name } = callExpressionNode.callee return type === 'Identifier' - && name === 'it' || name === 'test' + && (name === 'it' || name === 'test') } - function isTestAsync (node) { + function isTestAsync(node) { return node.arguments - && node.arguments.length >= 2 - && node.arguments[1].async === true + && node.arguments.length >= 2 + && node.arguments[1].async === true } const sourceCode = context.sourceCode ?? context.getSourceCode() return { - Identifier (node) { + Identifier(node) { if (node.name === 'cy' || node.name === 'Cypress') { const ancestors = sourceCode.getAncestors ? sourceCode.getAncestors(node) : context.getAncestors() const asyncTestBlocks = ancestors - .filter((n) => n.type === 'CallExpression') - .filter(isTestBlock) - .filter(isTestAsync) + .filter((n) => n.type === 'CallExpression') + .filter(isTestBlock) + .filter(isTestAsync) if (asyncTestBlocks.length >= 1) { asyncTestBlocks.forEach((node) => { diff --git a/lib/rules/no-chained-get.js b/lib/rules/no-chained-get.js index 557d06f..8ee4cba 100644 --- a/lib/rules/no-chained-get.js +++ b/lib/rules/no-chained-get.js @@ -1,8 +1,8 @@ -'use strict'; +'use strict' -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Rule Definition -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ /** @type {import('eslint').Rule.RuleModule} */ module.exports = { @@ -23,55 +23,55 @@ module.exports = { create(context) { const isRootCypress = (node) => { if ( - node.type !== 'CallExpression' || - node.callee.type !== 'MemberExpression' + node.type !== 'CallExpression' + || node.callee.type !== 'MemberExpression' ) { - return false; + return false } if ( - node.callee.object.type === 'Identifier' && - node.callee.object.name === 'cy' + node.callee.object.type === 'Identifier' + && node.callee.object.name === 'cy' ) { - return true; + return true } - return isRootCypress(node.callee.object); - }; + return isRootCypress(node.callee.object) + } const hasChainedGet = (node) => { // Check if this node is a get() call - const isGetCall = - node.callee && - node.callee.type === 'MemberExpression' && - node.callee.property && - node.callee.property.type === 'Identifier' && - node.callee.property.name === 'get'; + const isGetCall + = node.callee + && node.callee.type === 'MemberExpression' + && node.callee.property + && node.callee.property.type === 'Identifier' + && node.callee.property.name === 'get' if (!isGetCall) { - return false; + return false } - const obj = node.callee.object; + const obj = node.callee.object if (obj.type === 'CallExpression') { - const objCallee = obj.callee; + const objCallee = obj.callee if ( - objCallee && - objCallee.type === 'MemberExpression' && - objCallee.property && - objCallee.property.type === 'Identifier' && - objCallee.property.name === 'get' + objCallee + && objCallee.type === 'MemberExpression' + && objCallee.property + && objCallee.property.type === 'Identifier' + && objCallee.property.name === 'get' ) { - return true; + return true } - return hasChainedGet(obj); + return hasChainedGet(obj) } - return false; - }; + return false + } return { CallExpression(node) { @@ -79,9 +79,9 @@ module.exports = { context.report({ node, messageId: 'unexpected', - }); + }) } }, - }; + } }, -}; +} diff --git a/lib/rules/no-debug.js b/lib/rules/no-debug.js index c94ebf9..ab862bf 100644 --- a/lib/rules/no-debug.js +++ b/lib/rules/no-debug.js @@ -1,8 +1,8 @@ 'use strict' -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Rule Definition -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ module.exports = { meta: { @@ -20,37 +20,36 @@ module.exports = { }, }, - create (context) { - + create(context) { // variables should be defined here - //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- // Helpers - //---------------------------------------------------------------------- - function isCallingDebug (node) { - return node.callee && - node.callee.property && - node.callee.property.type === 'Identifier' && - node.callee.property.name === 'debug' + // ---------------------------------------------------------------------- + function isCallingDebug(node) { + return node.callee + && node.callee.property + && node.callee.property.type === 'Identifier' + && node.callee.property.name === 'debug' } - function isCypressCall (node) { + function isCypressCall(node) { if (!node.callee || node.callee.type !== 'MemberExpression') { - return false; + return false } if (node.callee.object.type === 'Identifier' && node.callee.object.name === 'cy') { - return true; + return true } - return isCypressCall(node.callee.object); + return isCypressCall(node.callee.object) } - - //---------------------------------------------------------------------- + + // ---------------------------------------------------------------------- // Public - //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- return { - CallExpression (node) { + CallExpression(node) { if (isCypressCall(node) && isCallingDebug(node)) { context.report({ node, messageId: 'unexpected' }) } diff --git a/lib/rules/no-force.js b/lib/rules/no-force.js index 66df424..f170e27 100644 --- a/lib/rules/no-force.js +++ b/lib/rules/no-force.js @@ -1,8 +1,8 @@ 'use strict' -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Rule Definition -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ module.exports = { meta: { @@ -20,39 +20,36 @@ module.exports = { }, }, - create (context) { - + create(context) { // variables should be defined here - //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- // Helpers - //---------------------------------------------------------------------- - function isCallingClickOrType (node) { + // ---------------------------------------------------------------------- + function isCallingClickOrType(node) { const allowedMethods = ['click', 'dblclick', 'type', 'trigger', 'check', 'rightclick', 'focus', 'select'] - return node.property && node.property.type === 'Identifier' && - allowedMethods.includes(node.property.name) + return node.property && node.property.type === 'Identifier' + && allowedMethods.includes(node.property.name) } - function isCypressCall (node) { - return node.callee.type === 'MemberExpression' && - node.callee.object.type === 'Identifier' && - node.callee.object.name === 'cy' + function isCypressCall(node) { + return node.callee.type === 'MemberExpression' + && node.callee.object.type === 'Identifier' + && node.callee.object.name === 'cy' } - function hasOptionForce (node) { - - return node.arguments && node.arguments.length && - node.arguments.some((arg) => { - return arg.type === 'ObjectExpression' && arg.properties.some((propNode) => propNode.key && propNode.key.name === 'force') - }) + function hasOptionForce(node) { + return node.arguments && node.arguments.length + && node.arguments.some((arg) => { + return arg.type === 'ObjectExpression' && arg.properties.some((propNode) => propNode.key && propNode.key.name === 'force') + }) } - function deepCheck (node, checkFunc) { + function deepCheck(node, checkFunc) { let currentNode = node while (currentNode.parent) { - if (checkFunc(currentNode.parent)) { return true } @@ -63,13 +60,13 @@ module.exports = { return false } - //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- // Public - //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- return { - CallExpression (node) { + CallExpression(node) { if (isCypressCall(node) && deepCheck(node, isCallingClickOrType) && deepCheck(node, hasOptionForce)) { context.report({ node, messageId: 'unexpected' }) } diff --git a/lib/rules/no-pause.js b/lib/rules/no-pause.js index b7f2b51..374ae8a 100644 --- a/lib/rules/no-pause.js +++ b/lib/rules/no-pause.js @@ -1,8 +1,8 @@ 'use strict' -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Rule Definition -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ module.exports = { meta: { @@ -20,37 +20,36 @@ module.exports = { }, }, - create (context) { - + create(context) { // variables should be defined here - //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- // Helpers - //---------------------------------------------------------------------- - function isCallingPause (node) { - return node.callee && - node.callee.property && - node.callee.property.type === 'Identifier' && - node.callee.property.name === 'pause' + // ---------------------------------------------------------------------- + function isCallingPause(node) { + return node.callee + && node.callee.property + && node.callee.property.type === 'Identifier' + && node.callee.property.name === 'pause' } - function isCypressCall (node) { + function isCypressCall(node) { if (!node.callee || node.callee.type !== 'MemberExpression') { - return false; + return false } if (node.callee.object.type === 'Identifier' && node.callee.object.name === 'cy') { - return true; + return true } - return isCypressCall(node.callee.object); + return isCypressCall(node.callee.object) } - - //---------------------------------------------------------------------- + + // ---------------------------------------------------------------------- // Public - //---------------------------------------------------------------------- + // ---------------------------------------------------------------------- return { - CallExpression (node) { + CallExpression(node) { if (isCypressCall(node) && isCallingPause(node)) { context.report({ node, messageId: 'unexpected' }) } diff --git a/lib/rules/no-unnecessary-waiting.js b/lib/rules/no-unnecessary-waiting.js index 1c1132e..50295b7 100644 --- a/lib/rules/no-unnecessary-waiting.js +++ b/lib/rules/no-unnecessary-waiting.js @@ -14,11 +14,11 @@ module.exports = { unexpected: 'Do not wait for arbitrary time periods', }, }, - create (context) { + create(context) { const sourceCode = context.sourceCode ?? context.getSourceCode() return { - CallExpression (node) { + CallExpression(node) { if (isCallingCyWait(node)) { const scope = sourceCode.getScope ? sourceCode.getScope(node) @@ -33,7 +33,7 @@ module.exports = { }, } -function nodeIsCalledByCy (node) { +function nodeIsCalledByCy(node) { if (node.type === 'Identifier' && node.name === 'cy') return true if (typeof node.callee === 'undefined' || typeof node.callee.object === 'undefined') { @@ -43,20 +43,20 @@ function nodeIsCalledByCy (node) { return nodeIsCalledByCy(node.callee.object) } -function isCallingCyWait (node) { - return node.callee.type === 'MemberExpression' && - nodeIsCalledByCy(node) && - node.callee.property.type === 'Identifier' && - node.callee.property.name === 'wait' +function isCallingCyWait(node) { + return node.callee.type === 'MemberExpression' + && nodeIsCalledByCy(node) + && node.callee.property.type === 'Identifier' + && node.callee.property.name === 'wait' } -function isNumberArgument (node) { - return node.arguments.length > 0 && - node.arguments[0].type === 'Literal' && - typeof (node.arguments[0].value) === 'number' +function isNumberArgument(node) { + return node.arguments.length > 0 + && node.arguments[0].type === 'Literal' + && typeof (node.arguments[0].value) === 'number' } -function isIdentifierNumberConstArgument (node, scope) { +function isIdentifierNumberConstArgument(node, scope) { if (node.arguments.length === 0) return false if (node.arguments[0].type !== 'Identifier') return false diff --git a/lib/rules/no-xpath.js b/lib/rules/no-xpath.js index 1e15763..7031acb 100644 --- a/lib/rules/no-xpath.js +++ b/lib/rules/no-xpath.js @@ -6,7 +6,7 @@ module.exports = { docs: { description: 'disallow using `cy.xpath()` calls', recommended: false, - url: 'https://github.com/cypress-io/eslint-plugin-cypress/blob/master/docs/rules/no-xpath.md' + url: 'https://github.com/cypress-io/eslint-plugin-cypress/blob/master/docs/rules/no-xpath.md', }, fixable: null, // Or `code` or `whitespace` schema: [], // Add a schema if the rule has options @@ -15,21 +15,21 @@ module.exports = { }, }, - create (context) { + create(context) { return { - CallExpression (node) { + CallExpression(node) { if (isCallingCyXpath(node)) { context.report({ node, messageId: 'unexpected' }) } }, } }, -}; +} -function isCallingCyXpath (node) { - return node.callee.type === 'MemberExpression' && - node.callee.object.type === 'Identifier' && - node.callee.object.name === 'cy' && - node.callee.property.type === 'Identifier' && - node.callee.property.name === 'xpath' +function isCallingCyXpath(node) { + return node.callee.type === 'MemberExpression' + && node.callee.object.type === 'Identifier' + && node.callee.object.name === 'cy' + && node.callee.property.type === 'Identifier' + && node.callee.property.name === 'xpath' } diff --git a/lib/rules/require-data-selectors.js b/lib/rules/require-data-selectors.js index 1bc8d84..f3ec9e6 100644 --- a/lib/rules/require-data-selectors.js +++ b/lib/rules/require-data-selectors.js @@ -15,9 +15,9 @@ module.exports = { }, }, - create (context) { + create(context) { return { - CallExpression (node) { + CallExpression(node) { if (isCallingCyGet(node) && !isDataArgument(node)) { context.report({ node, messageId: 'unexpected' }) } @@ -26,23 +26,23 @@ module.exports = { }, } -function isCallingCyGet (node) { - return node.callee.type === 'MemberExpression' && - node.callee.object.type === 'Identifier' && - node.callee.object.name === 'cy' && - node.callee.property.type === 'Identifier' && - node.callee.property.name === 'get' +function isCallingCyGet(node) { + return node.callee.type === 'MemberExpression' + && node.callee.object.type === 'Identifier' + && node.callee.object.name === 'cy' + && node.callee.property.type === 'Identifier' + && node.callee.property.name === 'get' } -function isDataArgument (node) { - return node.arguments.length > 0 && - ( - (node.arguments[0].type === 'Literal' && isAliasOrDataSelector(String(node.arguments[0].value))) || - (node.arguments[0].type === 'TemplateLiteral' && isAliasOrDataSelector(String(node.arguments[0].quasis[0].value.cooked))) +function isDataArgument(node) { + return node.arguments.length > 0 + && ( + (node.arguments[0].type === 'Literal' && isAliasOrDataSelector(String(node.arguments[0].value))) + || (node.arguments[0].type === 'TemplateLiteral' && isAliasOrDataSelector(String(node.arguments[0].quasis[0].value.cooked))) ) } -function isAliasOrDataSelector (selector) { +function isAliasOrDataSelector(selector) { return ['[data-', '@'].some(function (validValue) { return selector.startsWith(validValue) }) diff --git a/lib/rules/unsafe-to-chain-command.js b/lib/rules/unsafe-to-chain-command.js index 712bef6..bdaeadb 100644 --- a/lib/rules/unsafe-to-chain-command.js +++ b/lib/rules/unsafe-to-chain-command.js @@ -82,15 +82,15 @@ module.exports = { 'It is unsafe to chain further commands that rely on the subject after this command. It is best to split the chain, chaining again from `cy.` in a next command line.', }, }, - create (context) { + create(context) { const { methods } = getDefaultOptions(context) return { - CallExpression (node) { + CallExpression(node) { if ( - isRootCypress(node) && - isActionUnsafeToChain(node, methods) && - node.parent.type === 'MemberExpression' + isRootCypress(node) + && isActionUnsafeToChain(node, methods) + && node.parent.type === 'MemberExpression' ) { context.report({ node, @@ -108,15 +108,15 @@ module.exports = { */ const isRootCypress = (node) => { if ( - node.type !== 'CallExpression' || - node.callee.type !== 'MemberExpression' + node.type !== 'CallExpression' + || node.callee.type !== 'MemberExpression' ) { return false } if ( - node.callee.object.type === 'Identifier' && - node.callee.object.name === 'cy' + node.callee.object.type === 'Identifier' + && node.callee.object.name === 'cy' ) { return true } @@ -135,9 +135,9 @@ const isActionUnsafeToChain = (node, additionalMethods = []) => { ].join('|')) return ( - node.callee && - node.callee.property && - node.callee.property.type === 'Identifier' && - unsafeActionsRegex.test(node.callee.property.name) + node.callee + && node.callee.property + && node.callee.property.type === 'Identifier' + && unsafeActionsRegex.test(node.callee.property.name) ) } diff --git a/package-lock.json b/package-lock.json index 7682753..db54163 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "globals": "^16.2.0" }, "devDependencies": { + "@stylistic/eslint-plugin": "^4.4.0", "eslint": "^9.27.0", "eslint-plugin-eslint-plugin": "^6.4.0", "eslint-plugin-mocha": "^11.1.0", @@ -485,9 +486,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, "license": "MIT", "dependencies": { @@ -1439,19 +1440,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@semantic-release/npm/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -1542,6 +1530,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.0.tgz", + "integrity": "sha512-bIh/d9X+OQLCAMdhHtps+frvyjvAM4B1YlSJzcEEhl7wXLIqPar3ngn9DrHhkBOrTA/z9J0bUMtctAspe0dxdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.32.1", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", @@ -1563,6 +1584,171 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.0.tgz", + "integrity": "sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.33.0", + "@typescript-eslint/types": "^8.33.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.0.tgz", + "integrity": "sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/visitor-keys": "8.33.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.0.tgz", + "integrity": "sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.0.tgz", + "integrity": "sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.0.tgz", + "integrity": "sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.33.0", + "@typescript-eslint/tsconfig-utils": "8.33.0", + "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/visitor-keys": "8.33.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.0.tgz", + "integrity": "sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.33.0", + "@typescript-eslint/types": "8.33.0", + "@typescript-eslint/typescript-estree": "8.33.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.0.tgz", + "integrity": "sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.33.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@vitest/expect": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.4.tgz", @@ -2133,19 +2319,6 @@ "node": ">=18" } }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/conventional-commits-filter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", @@ -4051,19 +4224,6 @@ "dev": true, "license": "ISC" }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/normalize-url": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", @@ -7712,19 +7872,6 @@ "node": ">=8" } }, - "node_modules/semantic-release/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semantic-release/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -7751,6 +7898,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", @@ -7767,19 +7927,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver-diff/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/semver-regex": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", @@ -8368,6 +8515,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8381,6 +8541,21 @@ "node": ">= 0.8.0" } }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", diff --git a/package.json b/package.json index df321b2..8f215e7 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "globals": "^16.2.0" }, "devDependencies": { + "@stylistic/eslint-plugin": "^4.4.0", "eslint": "^9.27.0", "eslint-plugin-eslint-plugin": "^6.4.0", "eslint-plugin-mocha": "^11.1.0", diff --git a/tests/lib/rules/no-chained-get.js b/tests/lib/rules/no-chained-get.js index 4d01519..45ff34f 100644 --- a/tests/lib/rules/no-chained-get.js +++ b/tests/lib/rules/no-chained-get.js @@ -2,30 +2,30 @@ * @fileoverview disallow chain of `cy.get()` calls * @author benoit */ -"use strict"; +'use strict' -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Requirements -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ -const rule = require("../../../lib/rules/no-chained-get"), - RuleTester = require("eslint").RuleTester; +const rule = require('../../../lib/rules/no-chained-get'), + RuleTester = require('eslint').RuleTester -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Tests -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ -const ruleTester = new RuleTester(); -ruleTester.run("no-chained-get", rule, { +const ruleTester = new RuleTester() +ruleTester.run('no-chained-get', rule, { valid: [ - { code: "cy.get('div')" }, - { code: "cy.get('.div').find().get()" }, - { code: "cy.get('input').should('be.disabled')" }, + { code: 'cy.get(\'div\')' }, + { code: 'cy.get(\'.div\').find().get()' }, + { code: 'cy.get(\'input\').should(\'be.disabled\')' }, ], invalid: [ { - code: "cy.get('div').get('div')", - errors: [{ messageId: "unexpected" }], + code: 'cy.get(\'div\').get(\'div\')', + errors: [{ messageId: 'unexpected' }], }, ], -}); +}) diff --git a/tests/lib/rules/no-debug.js b/tests/lib/rules/no-debug.js index f48693e..7ba70e7 100644 --- a/tests/lib/rules/no-debug.js +++ b/tests/lib/rules/no-debug.js @@ -10,14 +10,14 @@ const errors = [{ messageId: 'unexpected' }] ruleTester.run('no-debug', rule, { valid: [ - { code: `debug()` }, - { code: `cy.get('button').dblclick()` }, + { code: 'debug()' }, + { code: 'cy.get(\'button\').dblclick()' }, ], invalid: [ - { code: `cy.debug()`, errors }, - { code: `cy.debug({ log: false })`, errors }, - { code: `cy.get('button').debug()`, errors }, - { code: `cy.get('a').should('have.attr', 'href').and('match', /dashboard/).debug()`, errors } + { code: 'cy.debug()', errors }, + { code: 'cy.debug({ log: false })', errors }, + { code: 'cy.get(\'button\').debug()', errors }, + { code: 'cy.get(\'a\').should(\'have.attr\', \'href\').and(\'match\', /dashboard/).debug()', errors }, ], }) diff --git a/tests/lib/rules/no-force.js b/tests/lib/rules/no-force.js index 708b688..40eaf71 100644 --- a/tests/lib/rules/no-force.js +++ b/tests/lib/rules/no-force.js @@ -10,30 +10,30 @@ const errors = [{ messageId: 'unexpected' }] ruleTester.run('no-force', rule, { valid: [ - { code: `cy.get('button').click()` }, - { code: `cy.get('button').click({multiple: true})` }, - { code: `cy.get('button').dblclick()` }, - { code: `cy.get('input').type('somth')` }, - { code: `cy.get('input').type('somth', {anyoption: true})` }, - { code: `cy.get('input').trigger('click', {anyoption: true})` }, - { code: `cy.get('input').rightclick({anyoption: true})` }, - { code: `cy.get('input').check()` }, - { code: `cy.get('input').select()` }, - { code: `cy.get('input').focus()` }, - { code: `cy.document().trigger("keydown", { ...event })` }, + { code: 'cy.get(\'button\').click()' }, + { code: 'cy.get(\'button\').click({multiple: true})' }, + { code: 'cy.get(\'button\').dblclick()' }, + { code: 'cy.get(\'input\').type(\'somth\')' }, + { code: 'cy.get(\'input\').type(\'somth\', {anyoption: true})' }, + { code: 'cy.get(\'input\').trigger(\'click\', {anyoption: true})' }, + { code: 'cy.get(\'input\').rightclick({anyoption: true})' }, + { code: 'cy.get(\'input\').check()' }, + { code: 'cy.get(\'input\').select()' }, + { code: 'cy.get(\'input\').focus()' }, + { code: 'cy.document().trigger("keydown", { ...event })' }, ], invalid: [ - { code: `cy.get('button').click({force: true})`, errors }, - { code: `cy.get('button').dblclick({force: true})`, errors }, - { code: `cy.get('input').type('somth', {force: true})`, errors }, - { code: `cy.get('div').find('.foo').type('somth', {force: true})`, errors }, - { code: `cy.get('div').find('.foo').find('.bar').click({force: true})`, errors }, - { code: `cy.get('div').find('.foo').find('.bar').trigger('change', {force: true})`, errors }, - { code: `cy.get('input').trigger('click', {force: true})`, errors }, - { code: `cy.get('input').rightclick({force: true})`, errors }, - { code: `cy.get('input').check({force: true})`, errors }, - { code: `cy.get('input').select({force: true})`, errors }, - { code: `cy.get('input').focus({force: true})`, errors }, + { code: 'cy.get(\'button\').click({force: true})', errors }, + { code: 'cy.get(\'button\').dblclick({force: true})', errors }, + { code: 'cy.get(\'input\').type(\'somth\', {force: true})', errors }, + { code: 'cy.get(\'div\').find(\'.foo\').type(\'somth\', {force: true})', errors }, + { code: 'cy.get(\'div\').find(\'.foo\').find(\'.bar\').click({force: true})', errors }, + { code: 'cy.get(\'div\').find(\'.foo\').find(\'.bar\').trigger(\'change\', {force: true})', errors }, + { code: 'cy.get(\'input\').trigger(\'click\', {force: true})', errors }, + { code: 'cy.get(\'input\').rightclick({force: true})', errors }, + { code: 'cy.get(\'input\').check({force: true})', errors }, + { code: 'cy.get(\'input\').select({force: true})', errors }, + { code: 'cy.get(\'input\').focus({force: true})', errors }, ], }) diff --git a/tests/lib/rules/no-pause.js b/tests/lib/rules/no-pause.js index 6a4d97f..a36fcc7 100644 --- a/tests/lib/rules/no-pause.js +++ b/tests/lib/rules/no-pause.js @@ -10,14 +10,14 @@ const errors = [{ messageId: 'unexpected' }] ruleTester.run('no-pause', rule, { valid: [ - { code: `pause()` }, - { code: `cy.get('button').dblclick()` }, + { code: 'pause()' }, + { code: 'cy.get(\'button\').dblclick()' }, ], invalid: [ - { code: `cy.pause()`, errors }, - { code: `cy.pause({ log: false })`, errors }, - { code: `cy.get('button').pause()`, errors }, - { code: `cy.get('a').should('have.attr', 'href').and('match', /dashboard/).pause()`, errors } + { code: 'cy.pause()', errors }, + { code: 'cy.pause({ log: false })', errors }, + { code: 'cy.get(\'button\').pause()', errors }, + { code: 'cy.get(\'a\').should(\'have.attr\', \'href\').and(\'match\', /dashboard/).pause()', errors }, ], }) diff --git a/tests/lib/rules/no-xpath.js b/tests/lib/rules/no-xpath.js index 0ba4e7b..a436e8b 100644 --- a/tests/lib/rules/no-xpath.js +++ b/tests/lib/rules/no-xpath.js @@ -1,30 +1,30 @@ -"use strict"; +'use strict' -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Requirements -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ -const rule = require("../../../lib/rules/no-xpath"), - RuleTester = require("eslint").RuleTester; +const rule = require('../../../lib/rules/no-xpath'), + RuleTester = require('eslint').RuleTester -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ // Tests -//------------------------------------------------------------------------------ +// ------------------------------------------------------------------------------ -const ruleTester = new RuleTester(); -ruleTester.run("no-xpath", rule, { +const ruleTester = new RuleTester() +ruleTester.run('no-xpath', rule, { valid: [ { code: 'cy.get("button").click({force: true})' }, ], invalid: [ { - code: "cy.xpath('//div[@class=\"container\"]/p[1]').click()", - errors: [{ messageId: "unexpected" }], + code: 'cy.xpath(\'//div[@class="container"]/p[1]\').click()', + errors: [{ messageId: 'unexpected' }], }, { - code: "cy.xpath('//p[1]').should('exist')", - errors: [{ messageId: "unexpected" }] - } + code: 'cy.xpath(\'//p[1]\').should(\'exist\')', + errors: [{ messageId: 'unexpected' }], + }, ], -}); +}) diff --git a/tests/lib/rules/unsafe-to-chain-command.js b/tests/lib/rules/unsafe-to-chain-command.js index fc97aa9..6f29a77 100644 --- a/tests/lib/rules/unsafe-to-chain-command.js +++ b/tests/lib/rules/unsafe-to-chain-command.js @@ -10,7 +10,7 @@ const errors = [{ messageId: 'unexpected' }] ruleTester.run('action-ends-chain', rule, { valid: [ { - code: 'cy.get("new-todo").type("todo A{enter}"); cy.get("new-todo").type("todo B{enter}"); cy.get("new-todo").should("have.class", "active");' + code: 'cy.get("new-todo").type("todo A{enter}"); cy.get("new-todo").type("todo B{enter}"); cy.get("new-todo").should("have.class", "active");', }, { code: 'cy.focused().should("be.visible");' }, { code: 'cy.submitBtn().click();' },