diff --git a/.eslintrc.js b/.eslintrc.js index da047d7b9..b73aa7c94 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -119,6 +119,7 @@ module.exports = { 'prefer-spread': 'error', 'dot-notation': 'error', + 'arrow-body-style': 'error', 'unicorn/consistent-function-scoping': [ 'error', diff --git a/docs/rules/no-expose-after-await.md b/docs/rules/no-expose-after-await.md index 54c587116..7855b833c 100644 --- a/docs/rules/no-expose-after-await.md +++ b/docs/rules/no-expose-after-await.md @@ -13,14 +13,14 @@ since: v8.1.0 ## :book: Rule Details -This rule reports usages of `expose()` after an `await` expression. -In the `setup()` function, `expose()` should be registered synchronously. +This rule reports usages of `expose()` and `defineExpose()` after an `await` expression. +In the `setup()` function, `expose()` should be registered synchronously. +In the ` +``` + + + ## :wrench: Options Nothing. diff --git a/lib/rules/attribute-hyphenation.js b/lib/rules/attribute-hyphenation.js index 0502ae3bc..1c097763c 100644 --- a/lib/rules/attribute-hyphenation.js +++ b/lib/rules/attribute-hyphenation.js @@ -107,9 +107,7 @@ module.exports = { * @param {string} value */ function isIgnoredAttribute(value) { - const isIgnored = ignoredAttributes.some((attr) => { - return value.includes(attr) - }) + const isIgnored = ignoredAttributes.some((attr) => value.includes(attr)) if (isIgnored) { return true diff --git a/lib/rules/no-dupe-v-else-if.js b/lib/rules/no-dupe-v-else-if.js index d0d74cfed..1500d7d24 100644 --- a/lib/rules/no-dupe-v-else-if.js +++ b/lib/rules/no-dupe-v-else-if.js @@ -167,11 +167,10 @@ module.exports = { for (const condition of listToCheck) { const operands = (condition.operands = condition.operands.filter( - (orOperand) => { - return !currentOrOperands.operands.some((currentOrOperand) => + (orOperand) => + !currentOrOperands.operands.some((currentOrOperand) => isSubset(currentOrOperand, orOperand) ) - } )) if (operands.length === 0) { context.report({ diff --git a/lib/rules/no-expose-after-await.js b/lib/rules/no-expose-after-await.js index 9d753ab81..fdfa10869 100644 --- a/lib/rules/no-expose-after-await.js +++ b/lib/rules/no-expose-after-await.js @@ -46,7 +46,7 @@ module.exports = { fixable: null, schema: [], messages: { - forbidden: 'The `expose` after `await` expression are forbidden.' + forbidden: '`{{name}}` is forbidden after an `await` expression.' } }, /** @param {RuleContext} context */ @@ -55,147 +55,192 @@ module.exports = { * @typedef {object} SetupScopeData * @property {boolean} afterAwait * @property {[number,number]} range - * @property {Set} exposeReferenceIds - * @property {Set} contextReferenceIds + * @property {(node: Identifier, callNode: CallExpression) => boolean} isExposeReferenceId + * @property {(node: Identifier) => boolean} isContextReferenceId */ /** * @typedef {object} ScopeStack * @property {ScopeStack | null} upper - * @property {FunctionDeclaration | FunctionExpression | ArrowFunctionExpression} scopeNode + * @property {FunctionDeclaration | FunctionExpression | ArrowFunctionExpression | Program} scopeNode */ - /** @type {Map} */ + /** @type {Map} */ const setupScopes = new Map() /** @type {ScopeStack | null} */ let scopeStack = null - return utils.defineVueVisitor(context, { - onSetupFunctionEnter(node) { - const contextParam = node.params[1] - if (!contextParam) { - // no arguments - return - } - if (contextParam.type === 'RestElement') { - // cannot check - return - } - if (contextParam.type === 'ArrayPattern') { - // cannot check - return + return utils.compositingVisitors( + { + /** + * @param {Program} node + */ + Program(node) { + scopeStack = { + upper: scopeStack, + scopeNode: node + } } - /** @type {Set} */ - const contextReferenceIds = new Set() - /** @type {Set} */ - const exposeReferenceIds = new Set() - if (contextParam.type === 'ObjectPattern') { - const exposeProperty = utils.findAssignmentProperty( - contextParam, - 'expose' - ) - if (!exposeProperty) { - return + }, + { + /** + * @param {FunctionExpression | FunctionDeclaration | ArrowFunctionExpression} node + */ + ':function'(node) { + scopeStack = { + upper: scopeStack, + scopeNode: node } - const exposeParam = exposeProperty.value - // `setup(props, {emit})` - const variable = - exposeParam.type === 'Identifier' - ? findVariable(context.getScope(), exposeParam) - : null - if (!variable) { + }, + ':function:exit'() { + scopeStack = scopeStack && scopeStack.upper + }, + /** @param {AwaitExpression} node */ + AwaitExpression(node) { + if (!scopeStack) { return } - for (const reference of variable.references) { - if (!reference.isRead()) { - continue - } - exposeReferenceIds.add(reference.identifier) + const setupScope = setupScopes.get(scopeStack.scopeNode) + if (!setupScope || !utils.inRange(setupScope.range, node)) { + return } - } else if (contextParam.type === 'Identifier') { - // `setup(props, context)` - const variable = findVariable(context.getScope(), contextParam) - if (!variable) { + setupScope.afterAwait = true + }, + /** @param {CallExpression} node */ + CallExpression(node) { + if (!scopeStack) { return } - for (const reference of variable.references) { - if (!reference.isRead()) { - continue - } - contextReferenceIds.add(reference.identifier) + const setupScope = setupScopes.get(scopeStack.scopeNode) + if ( + !setupScope || + !setupScope.afterAwait || + !utils.inRange(setupScope.range, node) + ) { + return } - } - setupScopes.set(node, { - afterAwait: false, - range: node.range, - exposeReferenceIds, - contextReferenceIds - }) - }, - /** - * @param {FunctionExpression | FunctionDeclaration | ArrowFunctionExpression} node - */ - ':function'(node) { - scopeStack = { - upper: scopeStack, - scopeNode: node - } - }, - ':function:exit'() { - scopeStack = scopeStack && scopeStack.upper - }, - /** @param {AwaitExpression} node */ - AwaitExpression(node) { - if (!scopeStack) { - return - } - const setupScope = setupScopes.get(scopeStack.scopeNode) - if (!setupScope || !utils.inRange(setupScope.range, node)) { - return - } - setupScope.afterAwait = true - }, - /** @param {CallExpression} node */ - CallExpression(node) { - if (!scopeStack) { - return - } - const setupScope = setupScopes.get(scopeStack.scopeNode) - if ( - !setupScope || - !setupScope.afterAwait || - !utils.inRange(setupScope.range, node) - ) { - return - } - const { contextReferenceIds, exposeReferenceIds } = setupScope - if ( - node.callee.type === 'Identifier' && - exposeReferenceIds.has(node.callee) - ) { - // setup(props,{expose}) {expose()} - context.report({ - node, - messageId: 'forbidden' - }) - } else { - const expose = getCalleeMemberNode(node) + const { isContextReferenceId, isExposeReferenceId } = setupScope if ( - expose && - expose.name === 'expose' && - expose.member.object.type === 'Identifier' && - contextReferenceIds.has(expose.member.object) + node.callee.type === 'Identifier' && + isExposeReferenceId(node.callee, node) ) { - // setup(props,context) {context.emit()} + // setup(props,{expose}) {expose()} context.report({ node, - messageId: 'forbidden' + messageId: 'forbidden', + data: { + name: node.callee.name + } }) + } else { + const expose = getCalleeMemberNode(node) + if ( + expose && + expose.name === 'expose' && + expose.member.object.type === 'Identifier' && + isContextReferenceId(expose.member.object) + ) { + // setup(props,context) {context.emit()} + context.report({ + node, + messageId: 'forbidden', + data: { + name: expose.name + } + }) + } } } }, - onSetupFunctionExit(node) { - setupScopes.delete(node) - } - }) + (() => { + const scriptSetup = utils.getScriptSetupElement(context) + if (!scriptSetup) { + return {} + } + return { + /** + * @param {Program} node + */ + Program(node) { + context + .getScope() + .references.find((ref) => ref.identifier.name === 'defineExpose') + setupScopes.set(node, { + afterAwait: false, + range: scriptSetup.range, + isExposeReferenceId: (_id, callNode) => + callNode.parent.type === 'ExpressionStatement' && + callNode.parent.parent === node, + isContextReferenceId: () => false + }) + } + } + })(), + utils.defineVueVisitor(context, { + onSetupFunctionEnter(node) { + const contextParam = node.params[1] + if (!contextParam) { + // no arguments + return + } + if (contextParam.type === 'RestElement') { + // cannot check + return + } + if (contextParam.type === 'ArrayPattern') { + // cannot check + return + } + /** @type {Set} */ + const contextReferenceIds = new Set() + /** @type {Set} */ + const exposeReferenceIds = new Set() + if (contextParam.type === 'ObjectPattern') { + const exposeProperty = utils.findAssignmentProperty( + contextParam, + 'expose' + ) + if (!exposeProperty) { + return + } + const exposeParam = exposeProperty.value + // `setup(props, {emit})` + const variable = + exposeParam.type === 'Identifier' + ? findVariable(context.getScope(), exposeParam) + : null + if (!variable) { + return + } + for (const reference of variable.references) { + if (!reference.isRead()) { + continue + } + exposeReferenceIds.add(reference.identifier) + } + } else if (contextParam.type === 'Identifier') { + // `setup(props, context)` + const variable = findVariable(context.getScope(), contextParam) + if (!variable) { + return + } + for (const reference of variable.references) { + if (!reference.isRead()) { + continue + } + contextReferenceIds.add(reference.identifier) + } + } + setupScopes.set(node, { + afterAwait: false, + range: node.range, + isExposeReferenceId: (id) => exposeReferenceIds.has(id), + isContextReferenceId: (id) => contextReferenceIds.has(id) + }) + }, + onSetupFunctionExit(node) { + setupScopes.delete(node) + } + }) + ) } } diff --git a/lib/rules/no-lifecycle-after-await.js b/lib/rules/no-lifecycle-after-await.js index d38a97a59..bb097910f 100644 --- a/lib/rules/no-lifecycle-after-await.js +++ b/lib/rules/no-lifecycle-after-await.js @@ -35,7 +35,7 @@ module.exports = { fixable: null, schema: [], messages: { - forbidden: 'The lifecycle hooks after `await` expression are forbidden.' + forbidden: 'Lifecycle hooks are forbidden after an `await` expression.' } }, /** @param {RuleContext} context */ diff --git a/lib/rules/no-restricted-call-after-await.js b/lib/rules/no-restricted-call-after-await.js index 7b6ff74e7..f4f3b6d38 100644 --- a/lib/rules/no-restricted-call-after-await.js +++ b/lib/rules/no-restricted-call-after-await.js @@ -169,9 +169,9 @@ module.exports = { local[ReferenceTracker.CALL] = true const message = option.message || - `The \`${[`import("${module}")`, ...paths].join( + `\`${[`import("${module}")`, ...paths].join( '.' - )}\` after \`await\` expression are forbidden.` + )}\` is forbidden after an \`await\` expression.` for (const { node } of tracker.iterateEsmReferences(traceMap)) { restrictedCallNodes.set(node, message) diff --git a/lib/rules/no-restricted-v-bind.js b/lib/rules/no-restricted-v-bind.js index 2fdb5b744..f9bf5462b 100644 --- a/lib/rules/no-restricted-v-bind.js +++ b/lib/rules/no-restricted-v-bind.js @@ -69,9 +69,9 @@ function parseOption(option) { if (!argTest(key)) { return false } - return /** @type {string[]} */ (option.modifiers).every((modName) => { - return key.modifiers.some((mid) => mid.name === modName) - }) + return /** @type {string[]} */ (option.modifiers).every((modName) => + key.modifiers.some((mid) => mid.name === modName) + ) } parsed.modifiers = option.modifiers } diff --git a/lib/rules/no-side-effects-in-computed-properties.js b/lib/rules/no-side-effects-in-computed-properties.js index 6e43266fb..7f7697b50 100644 --- a/lib/rules/no-side-effects-in-computed-properties.js +++ b/lib/rules/no-side-effects-in-computed-properties.js @@ -74,14 +74,13 @@ module.exports = { const computedProperty = ( info ? computedPropertiesMap.get(info.node) || [] : [] - ).find((cp) => { - return ( + ).find( + (cp) => cp.value && cp.value.range[0] <= node.range[0] && node.range[1] <= cp.value.range[1] && targetBody === cp.value - ) - }) + ) if (computedProperty) { const mem = node.parent if (mem.object !== node) { diff --git a/lib/rules/no-watch-after-await.js b/lib/rules/no-watch-after-await.js index 6ecc4dd75..ae88fd51a 100644 --- a/lib/rules/no-watch-after-await.js +++ b/lib/rules/no-watch-after-await.js @@ -51,7 +51,7 @@ module.exports = { fixable: null, schema: [], messages: { - forbidden: 'The `watch` after `await` expression are forbidden.' + forbidden: '`watch` is forbidden after an `await` expression.' } }, /** @param {RuleContext} context */ diff --git a/lib/rules/order-in-components.js b/lib/rules/order-in-components.js index 83e814413..1e0b517f8 100644 --- a/lib/rules/order-in-components.js +++ b/lib/rules/order-in-components.js @@ -259,15 +259,13 @@ module.exports = { function checkOrder(propertiesNodes) { const properties = propertiesNodes .filter(utils.isProperty) - .map((property) => { - return { - node: property, - name: - utils.getStaticPropertyName(property) || - (property.key.type === 'Identifier' && property.key.name) || - '' - } - }) + .map((property) => ({ + node: property, + name: + utils.getStaticPropertyName(property) || + (property.key.type === 'Identifier' && property.key.name) || + '' + })) for (const [i, property] of properties.entries()) { const orderPos = getOrderPosition(property.name) diff --git a/lib/rules/static-class-names-order.js b/lib/rules/static-class-names-order.js index bee820fa2..3e5e9a631 100644 --- a/lib/rules/static-class-names-order.js +++ b/lib/rules/static-class-names-order.js @@ -25,8 +25,8 @@ module.exports = { schema: [] }, /** @param {RuleContext} context */ - create: (context) => { - return defineTemplateBodyVisitor(context, { + create: (context) => + defineTemplateBodyVisitor(context, { /** @param {VAttribute} node */ "VAttribute[directive=false][key.name='class']"(node) { const value = node.value @@ -57,5 +57,4 @@ module.exports = { } } }) - } } diff --git a/lib/rules/v-on-event-hyphenation.js b/lib/rules/v-on-event-hyphenation.js index 16ea753ab..7060ab620 100644 --- a/lib/rules/v-on-event-hyphenation.js +++ b/lib/rules/v-on-event-hyphenation.js @@ -74,9 +74,7 @@ module.exports = { autofix && // It cannot be converted in snake_case. !name.includes('_') - ? (fixer) => { - return fixer.replaceText(argument, caseConverter(name)) - } + ? (fixer) => fixer.replaceText(argument, caseConverter(name)) : null }) } @@ -85,9 +83,7 @@ module.exports = { * @param {string} value */ function isIgnoredAttribute(value) { - const isIgnored = ignoredAttributes.some((attr) => { - return value.includes(attr) - }) + const isIgnored = ignoredAttributes.some((attr) => value.includes(attr)) if (isIgnored) { return true diff --git a/lib/utils/index.js b/lib/utils/index.js index 63a838bca..5a423faa4 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -675,13 +675,10 @@ module.exports = { * @param {ESNode} p * @returns {p is (Property & { key: Identifier & {name: 'components'}, value: ObjectExpression })} */ - (p) => { - return ( - p.type === 'Property' && - getStaticPropertyName(p) === 'components' && - p.value.type === 'ObjectExpression' - ) - } + (p) => + p.type === 'Property' && + getStaticPropertyName(p) === 'components' && + p.value.type === 'ObjectExpression' ) if (!componentsNode) { @@ -913,13 +910,10 @@ module.exports = { * @param {ESNode} p * @returns {p is (Property & { key: Identifier & {name: 'computed'}, value: ObjectExpression })} */ - (p) => { - return ( - p.type === 'Property' && - getStaticPropertyName(p) === 'computed' && - p.value.type === 'ObjectExpression' - ) - } + (p) => + p.type === 'Property' && + getStaticPropertyName(p) === 'computed' && + p.value.type === 'ObjectExpression' ) if (!computedPropertiesNode) { @@ -2705,14 +2699,11 @@ function getAttribute(node, name, value) { * @param {VAttribute | VDirective} node * @returns {node is VAttribute} */ - (node) => { - return ( - !node.directive && - node.key.name === name && - (value === undefined || - (node.value != null && node.value.value === value)) - ) - } + (node) => + !node.directive && + node.key.name === name && + (value === undefined || + (node.value != null && node.value.value === value)) ) || null ) } @@ -2731,9 +2722,7 @@ function getDirectives(node, name) { * @param {VAttribute | VDirective} node * @returns {node is VDirective} */ - (node) => { - return node.directive && node.key.name.name === name - } + (node) => node.directive && node.key.name.name === name ) } /** @@ -2750,16 +2739,13 @@ function getDirective(node, name, argument) { * @param {VAttribute | VDirective} node * @returns {node is VDirective} */ - (node) => { - return ( - node.directive && - node.key.name.name === name && - (argument === undefined || - (node.key.argument && - node.key.argument.type === 'VIdentifier' && - node.key.argument.name) === argument) - ) - } + (node) => + node.directive && + node.key.name.name === name && + (argument === undefined || + (node.key.argument && + node.key.argument.type === 'VIdentifier' && + node.key.argument.name) === argument) ) || null ) } @@ -2851,9 +2837,7 @@ function getComponentPropsFromOptions(componentObject) { * @param {ESNode} p * @returns {p is (Property & { key: Identifier & {name: 'props'} })} */ - (p) => { - return p.type === 'Property' && getStaticPropertyName(p) === 'props' - } + (p) => p.type === 'Property' && getStaticPropertyName(p) === 'props' ) if (!propsNode) { @@ -2888,9 +2872,7 @@ function getComponentEmitsFromOptions(componentObject) { * @param {ESNode} p * @returns {p is (Property & { key: Identifier & {name: 'emits'} })} */ - (p) => { - return p.type === 'Property' && getStaticPropertyName(p) === 'emits' - } + (p) => p.type === 'Property' && getStaticPropertyName(p) === 'emits' ) if (!emitsNode) { diff --git a/lib/utils/property-references.js b/lib/utils/property-references.js index e89457230..beb3118d6 100644 --- a/lib/utils/property-references.js +++ b/lib/utils/property-references.js @@ -533,9 +533,9 @@ function definePropertyReferenceExtractor(context) { // unknown name return ANY } - return extractFromName(refName, nameNode, () => { - return extractFromExpression(node, false).getNest('value') - }) + return extractFromName(refName, nameNode, () => + extractFromExpression(node, false).getNest('value') + ) } /** diff --git a/lib/utils/selector.js b/lib/utils/selector.js index a1b18bc83..862f695fb 100644 --- a/lib/utils/selector.js +++ b/lib/utils/selector.js @@ -373,9 +373,7 @@ function pseudoNodeToVElementMatcher(selector) { case ':not': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:not const selectors = selectorsToVElementMatcher(selector.nodes) - return (element, subject) => { - return !selectors(element, subject) - } + return (element, subject) => !selectors(element, subject) } case ':is': case ':where': diff --git a/tests/lib/rules/no-expose-after-await.js b/tests/lib/rules/no-expose-after-await.js index 2f33c58e6..d335da64a 100644 --- a/tests/lib/rules/no-expose-after-await.js +++ b/tests/lib/rules/no-expose-after-await.js @@ -101,7 +101,19 @@ tester.run('no-expose-after-await', rule, { + `, + parserOptions: { ecmaVersion: 2022 } + }, + { + filename: 'test.vue', + code: ` + `, parserOptions: { ecmaVersion: 2022 } @@ -122,7 +134,7 @@ tester.run('no-expose-after-await', rule, { `, errors: [ { - message: 'The `expose` after `await` expression are forbidden.', + message: '`expose` is forbidden after an `await` expression.', line: 6, column: 11 } @@ -142,11 +154,28 @@ tester.run('no-expose-after-await', rule, { `, errors: [ { - message: 'The `expose` after `await` expression are forbidden.', + message: '`expose` is forbidden after an `await` expression.', line: 6, column: 11 } ] + }, + { + filename: 'test.vue', + code: ` + + `, + parserOptions: { ecmaVersion: 2022 }, + errors: [ + { + message: '`defineExpose` is forbidden after an `await` expression.', + line: 4, + column: 7 + } + ] } ] }) diff --git a/tests/lib/rules/no-lifecycle-after-await.js b/tests/lib/rules/no-lifecycle-after-await.js index bb7414682..e75995a5f 100644 --- a/tests/lib/rules/no-lifecycle-after-await.js +++ b/tests/lib/rules/no-lifecycle-after-await.js @@ -174,8 +174,7 @@ tester.run('no-lifecycle-after-await', rule, { `, errors: [ { - message: - 'The lifecycle hooks after `await` expression are forbidden.', + message: 'Lifecycle hooks are forbidden after an `await` expression.', line: 8, column: 11, endLine: 8, diff --git a/tests/lib/rules/no-reserved-component-names.js b/tests/lib/rules/no-reserved-component-names.js index 126123dd4..4b39c0858 100644 --- a/tests/lib/rules/no-reserved-component-names.js +++ b/tests/lib/rules/no-reserved-component-names.js @@ -536,212 +536,188 @@ ruleTester.run('no-reserved-component-names', rule, { code: `fn1(component.data)`, parserOptions }, - ...vue2BuiltInComponents.map((name) => { - return { - filename: `${name}.vue`, - code: ` + ...vue2BuiltInComponents.map((name) => ({ + filename: `${name}.vue`, + code: ` export default { name: '${name}' } `, - parserOptions - } - }), - ...vue3BuiltInComponents.map((name) => { - return { - filename: `${name}.vue`, - code: ` + parserOptions + })), + ...vue3BuiltInComponents.map((name) => ({ + filename: `${name}.vue`, + code: ` export default { name: '${name}' } `, - parserOptions - } - }), - ...vue3BuiltInComponents.map((name) => { - return { - filename: `${name}.vue`, - code: ` + parserOptions + })), + ...vue3BuiltInComponents.map((name) => ({ + filename: `${name}.vue`, + code: ` export default { name: '${name}' } `, - parserOptions, - options: [{ disallowVueBuiltInComponents: true }] - } - }) + parserOptions, + options: [{ disallowVueBuiltInComponents: true }] + })) ], invalid: [ - ...invalidElements.map((name) => { - return { - filename: `${name}.vue`, - code: ` + ...invalidElements.map((name) => ({ + filename: `${name}.vue`, + code: ` export default { name: '${name}' } `, - parserOptions, - errors: [ - { - messageId: RESERVED_NAMES_IN_HTML.has(name) - ? 'reservedInHtml' - : 'reserved', - data: { name }, - type: 'Literal', - line: 3 - } - ] - } - }), - ...invalidElements.map((name) => { - return { - filename: 'test.vue', - code: `Vue.component('${name}', component)`, - parserOptions, - errors: [ - { - messageId: RESERVED_NAMES_IN_HTML.has(name) - ? 'reservedInHtml' - : 'reserved', - data: { name }, - type: 'Literal', - line: 1 - } - ] - } - }), - ...invalidElements.map((name) => { - return { - filename: 'test.vue', - code: `app.component('${name}', component)`, - parserOptions, - errors: [ - { - messageId: RESERVED_NAMES_IN_HTML.has(name) - ? 'reservedInHtml' - : 'reserved', - data: { name }, - type: 'Literal', - line: 1 - } - ] - } - }), - ...invalidElements.map((name) => { - return { - filename: 'test.vue', - code: `Vue.component(\`${name}\`, {})`, - parserOptions, - errors: [ - { - messageId: RESERVED_NAMES_IN_HTML.has(name) - ? 'reservedInHtml' - : 'reserved', - data: { name }, - type: 'TemplateLiteral', - line: 1 - } - ] - } - }), - ...invalidElements.map((name) => { - return { - filename: 'test.vue', - code: `app.component(\`${name}\`, {})`, - parserOptions, - errors: [ - { - messageId: RESERVED_NAMES_IN_HTML.has(name) - ? 'reservedInHtml' - : 'reserved', - data: { name }, - type: 'TemplateLiteral', - line: 1 - } - ] - } - }), - ...invalidElements.map((name) => { - return { - filename: 'test.vue', - code: `export default { + parserOptions, + errors: [ + { + messageId: RESERVED_NAMES_IN_HTML.has(name) + ? 'reservedInHtml' + : 'reserved', + data: { name }, + type: 'Literal', + line: 3 + } + ] + })), + ...invalidElements.map((name) => ({ + filename: 'test.vue', + code: `Vue.component('${name}', component)`, + parserOptions, + errors: [ + { + messageId: RESERVED_NAMES_IN_HTML.has(name) + ? 'reservedInHtml' + : 'reserved', + data: { name }, + type: 'Literal', + line: 1 + } + ] + })), + ...invalidElements.map((name) => ({ + filename: 'test.vue', + code: `app.component('${name}', component)`, + parserOptions, + errors: [ + { + messageId: RESERVED_NAMES_IN_HTML.has(name) + ? 'reservedInHtml' + : 'reserved', + data: { name }, + type: 'Literal', + line: 1 + } + ] + })), + ...invalidElements.map((name) => ({ + filename: 'test.vue', + code: `Vue.component(\`${name}\`, {})`, + parserOptions, + errors: [ + { + messageId: RESERVED_NAMES_IN_HTML.has(name) + ? 'reservedInHtml' + : 'reserved', + data: { name }, + type: 'TemplateLiteral', + line: 1 + } + ] + })), + ...invalidElements.map((name) => ({ + filename: 'test.vue', + code: `app.component(\`${name}\`, {})`, + parserOptions, + errors: [ + { + messageId: RESERVED_NAMES_IN_HTML.has(name) + ? 'reservedInHtml' + : 'reserved', + data: { name }, + type: 'TemplateLiteral', + line: 1 + } + ] + })), + ...invalidElements.map((name) => ({ + filename: 'test.vue', + code: `export default { components: { '${name}': {}, } }`, - parserOptions, - errors: [ - { - messageId: RESERVED_NAMES_IN_HTML.has(name) - ? 'reservedInHtml' - : 'reserved', - data: { name }, - type: 'Property', - line: 3 - } - ] - } - }), - ...vue2BuiltInComponents.map((name) => { - return { - filename: `${name}.vue`, - code: ` + parserOptions, + errors: [ + { + messageId: RESERVED_NAMES_IN_HTML.has(name) + ? 'reservedInHtml' + : 'reserved', + data: { name }, + type: 'Property', + line: 3 + } + ] + })), + ...vue2BuiltInComponents.map((name) => ({ + filename: `${name}.vue`, + code: ` export default { name: '${name}' } `, - parserOptions, - options: [{ disallowVueBuiltInComponents: true }], - errors: [ - { - messageId: 'reservedInVue', - data: { name }, - type: 'Literal', - line: 3 - } - ] - } - }), - ...vue2BuiltInComponents.map((name) => { - return { - filename: `${name}.vue`, - code: ` + parserOptions, + options: [{ disallowVueBuiltInComponents: true }], + errors: [ + { + messageId: 'reservedInVue', + data: { name }, + type: 'Literal', + line: 3 + } + ] + })), + ...vue2BuiltInComponents.map((name) => ({ + filename: `${name}.vue`, + code: ` export default { name: '${name}' } `, - parserOptions, - options: [{ disallowVue3BuiltInComponents: true }], - errors: [ - { - messageId: 'reservedInVue', - data: { name }, - type: 'Literal', - line: 3 - } - ] - } - }), - ...vue3BuiltInComponents.map((name) => { - return { - filename: `${name}.vue`, - code: ` + parserOptions, + options: [{ disallowVue3BuiltInComponents: true }], + errors: [ + { + messageId: 'reservedInVue', + data: { name }, + type: 'Literal', + line: 3 + } + ] + })), + ...vue3BuiltInComponents.map((name) => ({ + filename: `${name}.vue`, + code: ` export default { name: '${name}' } `, - parserOptions, - options: [{ disallowVue3BuiltInComponents: true }], - errors: [ - { - messageId: 'reservedInVue3', - data: { name }, - type: 'Literal', - line: 3 - } - ] - } - }) + parserOptions, + options: [{ disallowVue3BuiltInComponents: true }], + errors: [ + { + messageId: 'reservedInVue3', + data: { name }, + type: 'Literal', + line: 3 + } + ] + })) ] }) diff --git a/tests/lib/rules/no-restricted-call-after-await.js b/tests/lib/rules/no-restricted-call-after-await.js index 0eef6713b..69eaf3a42 100644 --- a/tests/lib/rules/no-restricted-call-after-await.js +++ b/tests/lib/rules/no-restricted-call-after-await.js @@ -170,7 +170,7 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("vue-i18n").useI18n` after `await` expression are forbidden.', + '`import("vue-i18n").useI18n` is forbidden after an `await` expression.', line: 7, column: 25, endLine: 7, @@ -195,7 +195,7 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("foo").bar.baz` after `await` expression are forbidden.', + '`import("foo").bar.baz` is forbidden after an `await` expression.', line: 7 } ] @@ -222,12 +222,12 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("vue-i18n").useI18n` after `await` expression are forbidden.', + '`import("vue-i18n").useI18n` is forbidden after an `await` expression.', line: 8 }, { message: - 'The `import("foo").bar.baz` after `await` expression are forbidden.', + '`import("foo").bar.baz` is forbidden after an `await` expression.', line: 9 } ] @@ -249,7 +249,7 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("foo").default` after `await` expression are forbidden.', + '`import("foo").default` is forbidden after an `await` expression.', line: 7 } ] @@ -271,7 +271,7 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("foo").default` after `await` expression are forbidden.', + '`import("foo").default` is forbidden after an `await` expression.', line: 7 } ] @@ -293,7 +293,7 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("vue-i18n").useI18n` after `await` expression are forbidden.', + '`import("vue-i18n").useI18n` is forbidden after an `await` expression.', line: 7 } ] @@ -324,17 +324,17 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("./foo").bar` after `await` expression are forbidden.', + '`import("./foo").bar` is forbidden after an `await` expression.', line: 10 }, { message: - 'The `import("./baz").qux` after `await` expression are forbidden.', + '`import("./baz").qux` is forbidden after an `await` expression.', line: 11 }, { message: - 'The `import("vue-i18n").useI18n` after `await` expression are forbidden.', + '`import("vue-i18n").useI18n` is forbidden after an `await` expression.', line: 12 } ] @@ -365,17 +365,17 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("./foo").bar` after `await` expression are forbidden.', + '`import("./foo").bar` is forbidden after an `await` expression.', line: 10 }, { message: - 'The `import("./baz").qux` after `await` expression are forbidden.', + '`import("./baz").qux` is forbidden after an `await` expression.', line: 11 }, { message: - 'The `import("vue-i18n").useI18n` after `await` expression are forbidden.', + '`import("vue-i18n").useI18n` is forbidden after an `await` expression.', line: 12 } ] @@ -397,7 +397,7 @@ tester.run('no-restricted-call-after-await', rule, { errors: [ { message: - 'The `import("..").foo` after `await` expression are forbidden.', + '`import("..").foo` is forbidden after an `await` expression.', line: 7 } ] diff --git a/tests/lib/rules/no-watch-after-await.js b/tests/lib/rules/no-watch-after-await.js index e97c78c63..c54c36eb7 100644 --- a/tests/lib/rules/no-watch-after-await.js +++ b/tests/lib/rules/no-watch-after-await.js @@ -188,7 +188,7 @@ tester.run('no-watch-after-await', rule, { `, errors: [ { - message: 'The `watch` after `await` expression are forbidden.', + message: '`watch` is forbidden after an `await` expression.', line: 8, column: 11, endLine: 8,