diff --git a/eslint-internal-rules/no-invalid-meta-docs-categories.js b/eslint-internal-rules/no-invalid-meta-docs-categories.js index 1ea9a16e6..03df5eb5a 100644 --- a/eslint-internal-rules/no-invalid-meta-docs-categories.js +++ b/eslint-internal-rules/no-invalid-meta-docs-categories.js @@ -70,16 +70,16 @@ function checkMetaValidity(context, exportsNode) { ) { // fixes.push(fixer.insertTextBefore(category.value, '['), fixer.insertTextAfter(category.value, ']')) - // for vue3 migration - if (category.value.value !== 'base') { + if (category.value.value === 'base') { + fixes.push(fixer.insertTextBefore(category.value, '[')) + } else { + // for vue3 migration fixes.push( fixer.insertTextBefore( category.value, `['vue3-${category.value.value}', ` ) ) - } else { - fixes.push(fixer.insertTextBefore(category.value, '[')) } fixes.push(fixer.insertTextAfter(category.value, ']')) } diff --git a/eslint.config.js b/eslint.config.js index be4b85d0a..abedce70b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -167,7 +167,6 @@ module.exports = [ 'unicorn/filename-case': 'off', 'unicorn/no-null': 'off', 'unicorn/no-array-callback-reference': 'off', // doesn't work well with TypeScript's custom type guards - 'unicorn/no-negated-condition': 'off', // remove when there are few pull requests (ref: #2146) 'unicorn/no-useless-undefined': 'off', 'unicorn/prefer-optional-catch-binding': 'off', // not supported by current ESLint parser version 'unicorn/prefer-module': 'off', @@ -175,9 +174,7 @@ module.exports = [ 'unicorn/prefer-at': 'off', // turn off to prevent make breaking changes (ref: #2146) 'unicorn/prefer-node-protocol': 'off', // turn off to prevent make breaking changes (ref: #2146) 'unicorn/prefer-string-replace-all': 'off', // turn off to prevent make breaking changes (ref: #2146) - 'unicorn/prefer-ternary': 'off', // remove when there are few pull requests (ref: #2146) 'unicorn/prefer-top-level-await': 'off', // turn off to prevent make breaking changes (ref: #2146) - 'unicorn/switch-case-braces': 'off', // remove when there are few pull requests (ref: #2146) 'internal/require-eslint-community': ['error'] } diff --git a/lib/processor.js b/lib/processor.js index f0a89fd8d..b7268fab9 100644 --- a/lib/processor.js +++ b/lib/processor.js @@ -46,40 +46,50 @@ module.exports = { const directiveType = message.messageId const data = message.message.split(' ') switch (directiveType) { - case 'disableBlock': + case 'disableBlock': { state.block.disableAllKeys.add(data[1]) break - case 'disableLine': + } + case 'disableLine': { state.line.disableAllKeys.add(data[1]) break - case 'enableBlock': + } + case 'enableBlock': { state.block.disableAllKeys.clear() break - case 'enableLine': + } + case 'enableLine': { state.line.disableAllKeys.clear() break - case 'disableBlockRule': + } + case 'disableBlockRule': { addDisableRule(state.block.disableRuleKeys, data[1], data[2]) break - case 'disableLineRule': + } + case 'disableLineRule': { addDisableRule(state.line.disableRuleKeys, data[1], data[2]) break - case 'enableBlockRule': + } + case 'enableBlockRule': { state.block.disableRuleKeys.delete(data[1]) break - case 'enableLineRule': + } + case 'enableLineRule': { state.line.disableRuleKeys.delete(data[1]) break - case 'clear': + } + case 'clear': { state.block.disableAllKeys.clear() state.block.disableRuleKeys.clear() state.line.disableAllKeys.clear() state.line.disableRuleKeys.clear() break - default: + } + default: { // unused eslint-disable comments report unusedDisableDirectiveReports.set(messageToKey(message), message) break + } } return false } else { diff --git a/lib/rules/attributes-order.js b/lib/rules/attributes-order.js index 28d4d1ffa..44404f05c 100644 --- a/lib/rules/attributes-order.js +++ b/lib/rules/attributes-order.js @@ -120,30 +120,39 @@ function getAttributeType(attribute) { if (!isVBind(attribute)) { const name = attribute.key.name.name switch (name) { - case 'for': + case 'for': { return ATTRS.LIST_RENDERING + } case 'if': case 'else-if': case 'else': case 'show': - case 'cloak': + case 'cloak': { return ATTRS.CONDITIONALS + } case 'pre': - case 'once': + case 'once': { return ATTRS.RENDER_MODIFIERS - case 'model': + } + case 'model': { return ATTRS.TWO_WAY_BINDING - case 'on': + } + case 'on': { return ATTRS.EVENTS + } case 'html': - case 'text': + case 'text': { return ATTRS.CONTENT - case 'slot': + } + case 'slot': { return ATTRS.SLOT - case 'is': + } + case 'is': { return ATTRS.DEFINITION - default: + } + default: { return ATTRS.OTHER_DIRECTIVES + } } } propName = @@ -154,17 +163,21 @@ function getAttributeType(attribute) { propName = attribute.key.name } switch (propName) { - case 'is': + case 'is': { return ATTRS.DEFINITION - case 'id': + } + case 'id': { return ATTRS.GLOBAL + } case 'ref': - case 'key': + case 'key': { return ATTRS.UNIQUE + } case 'slot': - case 'slot-scope': + case 'slot-scope': { return ATTRS.SLOT - default: + } + default: { if (isVBind(attribute)) { return ATTRS.ATTR_DYNAMIC } @@ -172,6 +185,7 @@ function getAttributeType(attribute) { return ATTRS.ATTR_SHORTHAND_BOOL } return ATTRS.ATTR_STATIC + } } } @@ -182,9 +196,9 @@ function getAttributeType(attribute) { */ function getPosition(attribute, attributePosition) { const attributeType = getAttributeType(attribute) - return attributePosition[attributeType] != null - ? attributePosition[attributeType] - : null + return attributePosition[attributeType] == null + ? null + : attributePosition[attributeType] } /** diff --git a/lib/rules/block-lang.js b/lib/rules/block-lang.js index 35898e938..55b85ce82 100644 --- a/lib/rules/block-lang.js +++ b/lib/rules/block-lang.js @@ -42,10 +42,12 @@ const DEFAULT_LANGUAGES = { function getAllowsLangPhrase(lang) { const langs = [...lang].map((s) => `"${s}"`) switch (langs.length) { - case 1: + case 1: { return langs[0] - default: + } + default: { return `${langs.slice(0, -1).join(', ')}, and ${langs[langs.length - 1]}` + } } } diff --git a/lib/rules/block-tag-newline.js b/lib/rules/block-tag-newline.js index 007c1e8e1..bccecd834 100644 --- a/lib/rules/block-tag-newline.js +++ b/lib/rules/block-tag-newline.js @@ -25,10 +25,12 @@ function getLinebreakCount(text) { */ function getPhrase(lineBreaks) { switch (lineBreaks) { - case 1: + case 1: { return '1 line break' - default: + } + default: { return `${lineBreaks} line breaks` + } } } @@ -322,17 +324,17 @@ module.exports = { return (element) => { const { name } = element const elementsOptions = blocks[name] - if (!elementsOptions) { - verifyElement(element, options) - } else { + if (elementsOptions) { normalizeOptionValue({ singleline: elementsOptions.singleline || options.singleline, multiline: elementsOptions.multiline || options.multiline, maxEmptyLines: - elementsOptions.maxEmptyLines != null - ? elementsOptions.maxEmptyLines - : options.maxEmptyLines + elementsOptions.maxEmptyLines == null + ? options.maxEmptyLines + : elementsOptions.maxEmptyLines })(element) + } else { + verifyElement(element, options) } } } diff --git a/lib/rules/comment-directive.js b/lib/rules/comment-directive.js index 8ed085602..aeca98aef 100644 --- a/lib/rules/comment-directive.js +++ b/lib/rules/comment-directive.js @@ -70,16 +70,16 @@ function parse(pattern, comment) { * @returns {void} */ function enable(context, loc, group, rule) { - if (!rule) { + if (rule) { context.report({ loc, - messageId: group === 'block' ? 'enableBlock' : 'enableLine' + messageId: group === 'block' ? 'enableBlockRule' : 'enableLineRule', + data: { rule } }) } else { context.report({ loc, - messageId: group === 'block' ? 'enableBlockRule' : 'enableLineRule', - data: { rule } + messageId: group === 'block' ? 'enableBlock' : 'enableLine' }) } } @@ -94,17 +94,17 @@ function enable(context, loc, group, rule) { * @returns {void} */ function disable(context, loc, group, rule, key) { - if (!rule) { + if (rule) { context.report({ loc, - messageId: group === 'block' ? 'disableBlock' : 'disableLine', - data: { key } + messageId: group === 'block' ? 'disableBlockRule' : 'disableLineRule', + data: { rule, key } }) } else { context.report({ loc, - messageId: group === 'block' ? 'disableBlockRule' : 'disableLineRule', - data: { rule, key } + messageId: group === 'block' ? 'disableBlock' : 'disableLine', + data: { key } }) } } diff --git a/lib/rules/define-emits-declaration.js b/lib/rules/define-emits-declaration.js index 3d64fed51..4daf4115c 100644 --- a/lib/rules/define-emits-declaration.js +++ b/lib/rules/define-emits-declaration.js @@ -36,7 +36,7 @@ module.exports = { return utils.defineScriptSetupVisitor(context, { onDefineEmitsEnter(node) { switch (defineType) { - case 'type-based': + case 'type-based': { if (node.arguments.length > 0) { context.report({ node, @@ -44,8 +44,9 @@ module.exports = { }) } break + } - case 'runtime': + case 'runtime': { if (node.typeParameters && node.typeParameters.params.length > 0) { context.report({ node, @@ -53,6 +54,7 @@ module.exports = { }) } break + } } } }) diff --git a/lib/rules/define-props-declaration.js b/lib/rules/define-props-declaration.js index 7a0be2259..c6fe4ffdc 100644 --- a/lib/rules/define-props-declaration.js +++ b/lib/rules/define-props-declaration.js @@ -36,7 +36,7 @@ module.exports = { return utils.defineScriptSetupVisitor(context, { onDefinePropsEnter(node) { switch (defineType) { - case 'type-based': + case 'type-based': { if (node.arguments.length > 0) { context.report({ node, @@ -44,8 +44,9 @@ module.exports = { }) } break + } - case 'runtime': + case 'runtime': { if (node.typeParameters && node.typeParameters.params.length > 0) { context.report({ node, @@ -53,6 +54,7 @@ module.exports = { }) } break + } } } }) diff --git a/lib/rules/html-closing-bracket-newline.js b/lib/rules/html-closing-bracket-newline.js index 0c787526a..e1a746e42 100644 --- a/lib/rules/html-closing-bracket-newline.js +++ b/lib/rules/html-closing-bracket-newline.js @@ -12,12 +12,15 @@ const utils = require('../utils') */ function getPhrase(lineBreaks) { switch (lineBreaks) { - case 0: + case 0: { return 'no line breaks' - case 1: + } + case 1: { return '1 line break' - default: + } + default: { return `${lineBreaks} line breaks` + } } } diff --git a/lib/rules/html-self-closing.js b/lib/rules/html-self-closing.js index 3cda61ffe..621cde6d1 100644 --- a/lib/rules/html-self-closing.js +++ b/lib/rules/html-self-closing.js @@ -78,7 +78,7 @@ function getElementType(node) { */ function isEmpty(node, sourceCode) { const start = node.startTag.range[1] - const end = node.endTag != null ? node.endTag.range[0] : node.range[1] + const end = node.endTag == null ? node.range[1] : node.endTag.range[0] return sourceCode.text.slice(start, end).trim() === '' } diff --git a/lib/rules/multiline-html-element-content-newline.js b/lib/rules/multiline-html-element-content-newline.js index a8ccc3676..dc4111864 100644 --- a/lib/rules/multiline-html-element-content-newline.js +++ b/lib/rules/multiline-html-element-content-newline.js @@ -34,10 +34,12 @@ function parseOptions(options) { */ function getPhrase(lineBreaks) { switch (lineBreaks) { - case 0: + case 0: { return 'no' - default: + } + default: { return `${lineBreaks}` + } } } /** diff --git a/lib/rules/no-boolean-default.js b/lib/rules/no-boolean-default.js index 5fd2560ad..66ca114bb 100644 --- a/lib/rules/no-boolean-default.js +++ b/lib/rules/no-boolean-default.js @@ -97,14 +97,15 @@ module.exports = { */ function verifyDefaultExpression(defaultNode) { switch (booleanType) { - case 'no-default': + case 'no-default': { context.report({ node: defaultNode, messageId: 'noBooleanDefault' }) break + } - case 'default-false': + case 'default-false': { if (defaultNode.type !== 'Literal' || defaultNode.value !== false) { context.report({ node: defaultNode, @@ -112,6 +113,7 @@ module.exports = { }) } break + } } } return utils.compositingVisitors( diff --git a/lib/rules/no-extra-parens.js b/lib/rules/no-extra-parens.js index c6da3a8bf..7264677cc 100644 --- a/lib/rules/no-extra-parens.js +++ b/lib/rules/no-extra-parens.js @@ -97,15 +97,15 @@ function createForVueSyntax(context) { function isUnwrapChangeToFilter(expression) { let parenStack = null for (const token of tokenStore.getTokens(expression)) { - if (!parenStack) { - if (token.value === '|') { - return true - } - } else { + if (parenStack) { if (parenStack.isUpToken(token)) { parenStack = parenStack.upper continue } + } else { + if (token.value === '|') { + return true + } } if (isLeftParen(token)) { parenStack = { isUpToken: isRightParen, upper: parenStack } diff --git a/lib/rules/no-multiple-template-root.js b/lib/rules/no-multiple-template-root.js index e4ed1b910..f7948ecd3 100644 --- a/lib/rules/no-multiple-template-root.js +++ b/lib/rules/no-multiple-template-root.js @@ -65,13 +65,7 @@ module.exports = { loc: extraText.loc, messageId: 'textRoot' }) - } else if (extraElement != null) { - context.report({ - node: extraElement, - loc: extraElement.loc, - messageId: 'multipleRoot' - }) - } else { + } else if (extraElement == null) { for (const element of rootElements) { const tag = element.startTag const name = element.name @@ -92,6 +86,12 @@ module.exports = { }) } } + } else { + context.report({ + node: extraElement, + loc: extraElement.loc, + messageId: 'multipleRoot' + }) } } } diff --git a/lib/rules/no-restricted-props.js b/lib/rules/no-restricted-props.js index c7203054b..21f53cc7d 100644 --- a/lib/rules/no-restricted-props.js +++ b/lib/rules/no-restricted-props.js @@ -109,17 +109,17 @@ module.exports = { option.message || `Using \`${prop.propName}\` props is not allowed.` context.report({ - node: prop.type !== 'infer-type' ? prop.key : prop.node, + node: prop.type === 'infer-type' ? prop.node : prop.key, messageId: 'restrictedProp', data: { message }, suggest: - prop.type !== 'infer-type' - ? createSuggest( + prop.type === 'infer-type' + ? null + : createSuggest( prop.key, option, withDefaultsProps && withDefaultsProps[prop.propName] ) - : null }) break } diff --git a/lib/rules/no-unused-components.js b/lib/rules/no-unused-components.js index af26a964b..603cce85d 100644 --- a/lib/rules/no-unused-components.js +++ b/lib/rules/no-unused-components.js @@ -36,9 +36,9 @@ module.exports = { create(context) { const options = context.options[0] || {} const ignoreWhenBindingPresent = - options.ignoreWhenBindingPresent !== undefined - ? options.ignoreWhenBindingPresent - : true + options.ignoreWhenBindingPresent === undefined + ? true + : options.ignoreWhenBindingPresent const usedComponents = new Set() /** @type { { node: Property, name: string }[] } */ let registeredComponents = [] diff --git a/lib/rules/no-unused-properties.js b/lib/rules/no-unused-properties.js index 818dcc053..fd9b0df2c 100644 --- a/lib/rules/no-unused-properties.js +++ b/lib/rules/no-unused-properties.js @@ -423,7 +423,7 @@ module.exports = { type: prop.type, name: prop.propName, groupName: 'props', - node: prop.type !== 'infer-type' ? prop.key : prop.node + node: prop.type === 'infer-type' ? prop.node : prop.key }) } } diff --git a/lib/rules/require-default-prop.js b/lib/rules/require-default-prop.js index 81f40c71f..194e4bb8a 100644 --- a/lib/rules/require-default-prop.js +++ b/lib/rules/require-default-prop.js @@ -150,9 +150,9 @@ module.exports = { continue } const propName = - prop.propName != null - ? prop.propName - : `[${context.getSourceCode().getText(prop.node.key)}]` + prop.propName == null + ? `[${context.getSourceCode().getText(prop.node.key)}]` + : prop.propName context.report({ node: prop.node, diff --git a/lib/rules/require-prop-comment.js b/lib/rules/require-prop-comment.js index 845bba9df..41e1d57fb 100644 --- a/lib/rules/require-prop-comment.js +++ b/lib/rules/require-prop-comment.js @@ -76,18 +76,22 @@ module.exports = { let messageId switch (type) { - case 'block': + case 'block': { messageId = verifyBlock(lastPrecedingComment) break - case 'line': + } + case 'line': { messageId = verifyLine(lastPrecedingComment) break - case 'any': + } + case 'any': { messageId = verifyAny(lastPrecedingComment) break - default: + } + default: { messageId = verifyJSDoc(lastPrecedingComment) break + } } if (!messageId) { diff --git a/lib/rules/require-valid-default-prop.js b/lib/rules/require-valid-default-prop.js index 24b911b2b..ab6e9b14b 100644 --- a/lib/rules/require-valid-default-prop.js +++ b/lib/rules/require-valid-default-prop.js @@ -236,9 +236,9 @@ module.exports = { */ function report(node, prop, expectedTypeNames) { const propName = - prop.propName != null - ? prop.propName - : `[${context.getSourceCode().getText(prop.node.key)}]` + prop.propName == null + ? `[${context.getSourceCode().getText(prop.node.key)}]` + : prop.propName context.report({ node, messageId: 'invalidType', @@ -285,21 +285,7 @@ module.exports = { if (!defType) continue - if (!defType.function) { - if ( - typeNames.has(defType.type) && - !FUNCTION_VALUE_TYPES.has(defType.type) - ) { - continue - } - report( - defExpr, - prop, - [...typeNames].map((type) => - FUNCTION_VALUE_TYPES.has(type) ? 'Function' : type - ) - ) - } else { + if (defType.function) { if (typeNames.has('Function')) { continue } @@ -315,6 +301,20 @@ module.exports = { default: defType }) } + } else { + if ( + typeNames.has(defType.type) && + !FUNCTION_VALUE_TYPES.has(defType.type) + ) { + continue + } + report( + defExpr, + prop, + [...typeNames].map((type) => + FUNCTION_VALUE_TYPES.has(type) ? 'Function' : type + ) + ) } } return propContexts diff --git a/lib/rules/this-in-template.js b/lib/rules/this-in-template.js index d93f07f78..0652902f0 100644 --- a/lib/rules/this-in-template.js +++ b/lib/rules/this-in-template.js @@ -34,7 +34,7 @@ module.exports = { * @returns {Object} AST event handlers. */ create(context) { - const options = context.options[0] !== 'always' ? 'never' : 'always' + const options = context.options[0] === 'always' ? 'always' : 'never' /** * @typedef {object} ScopeStack * @property {ScopeStack | null} parent diff --git a/lib/rules/v-on-handler-style.js b/lib/rules/v-on-handler-style.js index aa1214e38..890965156 100644 --- a/lib/rules/v-on-handler-style.js +++ b/lib/rules/v-on-handler-style.js @@ -179,11 +179,13 @@ module.exports = { */ function verifyForInlineHandler(node, kind) { switch (kind) { - case 'method': + case 'method': { return verifyCanUseMethodHandlerForInlineHandler(node) - case 'inline-function': + } + case 'inline-function': { reportCanUseInlineFunctionForInlineHandler(node) return true + } } return false } @@ -196,7 +198,7 @@ module.exports = { function reportForMethodHandler(node, kind) { switch (kind) { case 'inline': - case 'inline-function': + case 'inline-function': { context.report({ node, messageId: @@ -205,6 +207,7 @@ module.exports = { : 'preferInlineFunctionOverMethod' }) return true + } } // This path is currently not taken. return false @@ -217,11 +220,13 @@ module.exports = { */ function verifyForInlineFunction(node, kind) { switch (kind) { - case 'method': + case 'method': { return verifyCanUseMethodHandlerForInlineFunction(node) - case 'inline': + } + case 'inline': { reportCanUseInlineHandlerForInlineFunction(node) return true + } } return false } @@ -529,8 +534,9 @@ module.exports = { } break } - default: + default: { return + } } }, ...(allows.includes('inline-function') diff --git a/lib/rules/v-slot-style.js b/lib/rules/v-slot-style.js index 1bb5f57f2..daa3d96da 100644 --- a/lib/rules/v-slot-style.js +++ b/lib/rules/v-slot-style.js @@ -141,14 +141,18 @@ module.exports = { fix(fixer) { switch (expected) { - case 'shorthand': + case 'shorthand': { return fixer.replaceTextRange(range, `#${argumentText}`) - case 'longform': + } + case 'longform': { return fixer.replaceTextRange(range, `v-slot:${argumentText}`) - case 'v-slot': + } + case 'v-slot': { return fixer.replaceTextRange(range, 'v-slot') - default: + } + default: { return null + } } } }) diff --git a/lib/utils/indent-common.js b/lib/utils/indent-common.js index 4e3edb229..5b97f37b5 100644 --- a/lib/utils/indent-common.js +++ b/lib/utils/indent-common.js @@ -372,7 +372,7 @@ module.exports.defineVisitor = function create( } const elementTokens = getFirstAndLastTokens( node, - lastToken != null ? lastToken.range[1] : 0 + lastToken == null ? 0 : lastToken.range[1] ) // Collect comma/comment tokens between the last token of the previous node and the first token of this node. @@ -578,15 +578,15 @@ module.exports.defineVisitor = function create( function processTopLevelNode(node, expectedIndent) { const token = tokenStore.getFirstToken(node) const offsetInfo = offsets.get(token) - if (offsetInfo != null) { - offsetInfo.expectedIndent = expectedIndent - } else { + if (offsetInfo == null) { offsets.set(token, { baseToken: null, offset: 0, baseline: false, expectedIndent }) + } else { + offsetInfo.expectedIndent = expectedIndent } } @@ -639,9 +639,7 @@ module.exports.defineVisitor = function create( const offsetInfo = offsets.get(token) if (offsetInfo != null) { - if (offsetInfo.expectedIndent != null) { - expectedIndents.push(offsetInfo.expectedIndent) - } else { + if (offsetInfo.expectedIndent == null) { const baseOffsetInfo = offsets.get(offsetInfo.baseToken) if ( baseOffsetInfo != null && @@ -656,6 +654,8 @@ module.exports.defineVisitor = function create( break } } + } else { + expectedIndents.push(offsetInfo.expectedIndent) } } } @@ -943,7 +943,12 @@ module.exports.defineVisitor = function create( }, /** @param {VElement} node */ VElement(node) { - if (!PREFORMATTED_ELEMENT_NAMES.has(node.name)) { + if (PREFORMATTED_ELEMENT_NAMES.has(node.name)) { + const startTagToken = tokenStore.getFirstToken(node) + const endTagToken = node.endTag && tokenStore.getFirstToken(node.endTag) + setOffset(endTagToken, 0, startTagToken) + setPreformattedTokens(node) + } else { const isTopLevel = node.parent.type !== 'VElement' const offset = isTopLevel ? options.baseIndent : 1 processNodeList( @@ -953,11 +958,6 @@ module.exports.defineVisitor = function create( offset, false ) - } else { - const startTagToken = tokenStore.getFirstToken(node) - const endTagToken = node.endTag && tokenStore.getFirstToken(node.endTag) - setOffset(endTagToken, 0, startTagToken) - setPreformattedTokens(node) } }, /** @param {VEndTag} node */ @@ -1050,9 +1050,9 @@ module.exports.defineVisitor = function create( ) if (closeToken != null && closeToken.type.endsWith('TagClose')) { const offset = - closeToken.type !== 'HTMLSelfClosingTagClose' - ? options.closeBracket.startTag - : options.closeBracket.selfClosingTag + closeToken.type === 'HTMLSelfClosingTagClose' + ? options.closeBracket.selfClosingTag + : options.closeBracket.startTag setOffset(closeToken, offset, openToken) } }, @@ -1290,9 +1290,7 @@ module.exports.defineVisitor = function create( ...tokenStore.getTokensBetween(exportToken, node.source), tokenStore.getFirstToken(node.source) ] - if (!node.exported) { - setOffset(tokens, 1, exportToken) - } else { + if (node.exported) { // export * as foo from "mod" const starToken = /** @type {Token} */ (tokens.find(isWildcard)) const asToken = tokenStore.getTokenAfter(starToken) @@ -1303,6 +1301,8 @@ module.exports.defineVisitor = function create( setOffset(asToken, 1, starToken) setOffset(exportedToken, 1, starToken) setOffset(afterTokens, 1, exportToken) + } else { + setOffset(tokens, 1, exportToken) } // assertions @@ -1732,7 +1732,11 @@ module.exports.defineVisitor = function create( SwitchCase(node) { const caseToken = tokenStore.getFirstToken(node) - if (node.test != null) { + if (node.test == null) { + const colonToken = tokenStore.getTokenAfter(caseToken) + + setOffset(colonToken, 1, caseToken) + } else { const testToken = tokenStore.getTokenAfter(caseToken) const colonToken = tokenStore.getTokenAfter( node.test, @@ -1740,10 +1744,6 @@ module.exports.defineVisitor = function create( ) setOffset([testToken, colonToken], 1, caseToken) - } else { - const colonToken = tokenStore.getTokenAfter(caseToken) - - setOffset(colonToken, 1, caseToken) } if ( diff --git a/lib/utils/index.js b/lib/utils/index.js index 337b31a83..0c9a4ac99 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -1723,11 +1723,10 @@ module.exports = { } for (let i = 1; i <= alen; i++) { for (let j = 1; j <= blen; j++) { - if (a[i - 1] === b[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] - } else { - dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1 - } + dp[i][j] = + a[i - 1] === b[j - 1] + ? dp[i - 1][j - 1] + : Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1 } } return dp[alen][blen] diff --git a/lib/utils/property-references.js b/lib/utils/property-references.js index 4be7b17c7..4d4e39805 100644 --- a/lib/utils/property-references.js +++ b/lib/utils/property-references.js @@ -650,14 +650,14 @@ function definePropertyReferenceExtractor( if (ignoreRef(id.name)) { continue } - if (!isFunctionalTemplate) { - references.push( - extractFromName(id.name, id, () => extractFromExpression(id, true)) - ) - } else { + if (isFunctionalTemplate) { if (id.name === 'props') { references.push(extractFromExpression(id, true)) } + } else { + references.push( + extractFromName(id.name, id, () => extractFromExpression(id, true)) + ) } } return mergePropertyReferences(references) diff --git a/lib/utils/selector.js b/lib/utils/selector.js index 862f695fb..67960d59a 100644 --- a/lib/utils/selector.js +++ b/lib/utils/selector.js @@ -168,7 +168,7 @@ function selectorToVElementMatcher(selectorChildren) { */ function combination(left, combinator, right) { switch (combinator.trim()) { - case '': + case '': { // descendant return (element, subject) => { if (right(element, null)) { @@ -182,7 +182,8 @@ function combination(left, combinator, right) { } return false } - case '>': + } + case '>': { // child return (element, subject) => { if (right(element, null)) { @@ -193,7 +194,8 @@ function combination(left, combinator, right) { } return false } - case '+': + } + case '+': { // adjacent return (element, subject) => { if (right(element, null)) { @@ -204,7 +206,8 @@ function combination(left, combinator, right) { } return false } - case '~': + } + case '~': { // sibling return (element, subject) => { if (right(element, null)) { @@ -216,8 +219,10 @@ function combination(left, combinator, right) { } return false } - default: + } + default: { throw new SelectorError(`Unknown combinator: ${combinator}.`) + } } } @@ -228,26 +233,35 @@ function combination(left, combinator, right) { */ function nodeToVElementMatcher(selector) { switch (selector.type) { - case 'attribute': + case 'attribute': { return attributeNodeToVElementMatcher(selector) - case 'class': + } + case 'class': { return classNameNodeToVElementMatcher(selector) - case 'id': + } + case 'id': { return identifierNodeToVElementMatcher(selector) - case 'tag': + } + case 'tag': { return tagNodeToVElementMatcher(selector) - case 'universal': + } + case 'universal': { return universalNodeToVElementMatcher(selector) - case 'pseudo': + } + case 'pseudo': { return pseudoNodeToVElementMatcher(selector) - case 'nesting': + } + case 'nesting': { throw new SelectorError('Unsupported nesting selector.') - case 'string': + } + case 'string': { throw new SelectorError(`Unknown selector: ${selector.value}.`) - default: + } + default: { throw new SelectorError( `Unknown selector: ${/** @type {any}*/ (selector).value}.` ) + } } } @@ -264,30 +278,37 @@ function attributeNodeToVElementMatcher(selector) { const value = selector.value || '' switch (selector.operator) { - case '=': + case '=': { return buildVElementMatcher(value, (attr, val) => attr === val) - case '~=': + } + case '~=': { // words return buildVElementMatcher(value, (attr, val) => attr.split(/\s+/gu).includes(val) ) - case '|=': + } + case '|=': { // immediately followed by hyphen return buildVElementMatcher( value, (attr, val) => attr === val || attr.startsWith(`${val}-`) ) - case '^=': + } + case '^=': { // prefixed return buildVElementMatcher(value, (attr, val) => attr.startsWith(val)) - case '$=': + } + case '$=': { // suffixed return buildVElementMatcher(value, (attr, val) => attr.endsWith(val)) - case '*=': + } + case '*=': { // contains return buildVElementMatcher(value, (attr, val) => attr.includes(val)) - default: + } + default: { throw new SelectorError(`Unsupported operator: ${selector.operator}.`) + } } /** @@ -376,19 +397,22 @@ function pseudoNodeToVElementMatcher(selector) { return (element, subject) => !selectors(element, subject) } case ':is': - case ':where': + case ':where': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:is // https://developer.mozilla.org/en-US/docs/Web/CSS/:where return selectorsToVElementMatcher(selector.nodes) - case ':has': + } + case ':has': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:has return pseudoHasSelectorsToVElementMatcher(selector.nodes) - case ':empty': + } + case ':empty': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:empty return (element) => element.children.every( (child) => child.type === 'VText' && !child.value.trim() ) + } case ':nth-child': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-child const nth = parseNth(selector) @@ -401,19 +425,22 @@ function pseudoNodeToVElementMatcher(selector) { nth(length - index - 1) ) } - case ':first-child': + case ':first-child': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:first-child return buildPseudoNthVElementMatcher((index) => index === 0) - case ':last-child': + } + case ':last-child': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:last-child return buildPseudoNthVElementMatcher( (index, length) => index === length - 1 ) - case ':only-child': + } + case ':only-child': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:only-child return buildPseudoNthVElementMatcher( (index, length) => index === 0 && length === 1 ) + } case ':nth-of-type': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:nth-of-type const nth = parseNth(selector) @@ -426,21 +453,25 @@ function pseudoNodeToVElementMatcher(selector) { nth(length - index - 1) ) } - case ':first-of-type': + case ':first-of-type': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:first-of-type return buildPseudoNthOfTypeVElementMatcher((index) => index === 0) - case ':last-of-type': + } + case ':last-of-type': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:last-of-type return buildPseudoNthOfTypeVElementMatcher( (index, length) => index === length - 1 ) - case ':only-of-type': + } + case ':only-of-type': { // https://developer.mozilla.org/en-US/docs/Web/CSS/:only-of-type return buildPseudoNthOfTypeVElementMatcher( (index, length) => index === 0 && length === 1 ) - default: + } + default: { throw new SelectorError(`Unsupported pseudo selector: ${pseudo}.`) + } } } diff --git a/lib/utils/ts-utils/ts-ast.js b/lib/utils/ts-utils/ts-ast.js index 8561bf565..d019b77cd 100644 --- a/lib/utils/ts-utils/ts-ast.js +++ b/lib/utils/ts-utils/ts-ast.js @@ -321,34 +321,45 @@ function flattenTypeNodes(context, node) { function inferRuntimeType(context, node, checked = new Set()) { switch (node.type) { case 'TSStringKeyword': - case 'TSTemplateLiteralType': + case 'TSTemplateLiteralType': { return ['String'] - case 'TSNumberKeyword': + } + case 'TSNumberKeyword': { return ['Number'] - case 'TSBooleanKeyword': + } + case 'TSBooleanKeyword': { return ['Boolean'] - case 'TSObjectKeyword': + } + case 'TSObjectKeyword': { return ['Object'] - case 'TSTypeLiteral': + } + case 'TSTypeLiteral': { return inferTypeLiteralType(node) - case 'TSFunctionType': + } + case 'TSFunctionType': { return ['Function'] + } case 'TSArrayType': - case 'TSTupleType': + case 'TSTupleType': { return ['Array'] - case 'TSSymbolKeyword': + } + case 'TSSymbolKeyword': { return ['Symbol'] + } - case 'TSLiteralType': + case 'TSLiteralType': { if (node.literal.type === 'Literal') { switch (typeof node.literal.value) { - case 'boolean': + case 'boolean': { return ['Boolean'] - case 'string': + } + case 'string': { return ['String'] + } case 'number': - case 'bigint': + case 'bigint': { return ['Number'] + } } if (node.literal.value instanceof RegExp) { return ['RegExp'] @@ -358,7 +369,8 @@ function inferRuntimeType(context, node, checked = new Set()) { context, /** @type {TypeNode} */ (node) ) - case 'TSTypeReference': + } + case 'TSTypeReference': { if (node.typeName.type === 'Identifier') { const variable = findVariable(context.getScope(), node.typeName.name) if (variable && variable.defs.length === 1) { @@ -391,8 +403,9 @@ function inferRuntimeType(context, node, checked = new Set()) { case 'Map': case 'WeakSet': case 'WeakMap': - case 'Date': + case 'Date': { return [name] + } } } @@ -403,17 +416,20 @@ function inferRuntimeType(context, node, checked = new Set()) { case 'Pick': case 'Omit': case 'Required': - case 'InstanceType': + case 'InstanceType': { return ['Object'] + } case 'Uppercase': case 'Lowercase': case 'Capitalize': - case 'Uncapitalize': + case 'Uncapitalize': { return ['String'] + } case 'Parameters': - case 'ConstructorParameters': + case 'ConstructorParameters': { return ['Array'] - case 'NonNullable': + } + case 'NonNullable': { if (node.typeParameters && node.typeParameters.params[0]) { return inferRuntimeType( context, @@ -422,7 +438,8 @@ function inferRuntimeType(context, node, checked = new Set()) { ).filter((t) => t !== 'null') } break - case 'Extract': + } + case 'Extract': { if (node.typeParameters && node.typeParameters.params[1]) { return inferRuntimeType( context, @@ -431,8 +448,9 @@ function inferRuntimeType(context, node, checked = new Set()) { ) } break + } case 'Exclude': - case 'OmitThisParameter': + case 'OmitThisParameter': { if (node.typeParameters && node.typeParameters.params[0]) { return inferRuntimeType( context, @@ -441,22 +459,26 @@ function inferRuntimeType(context, node, checked = new Set()) { ) } break + } } } return inferRuntimeTypeFromTypeNode( context, /** @type {TypeNode} */ (node) ) + } case 'TSUnionType': - case 'TSIntersectionType': + case 'TSIntersectionType': { return inferUnionType(node) + } - default: + default: { return inferRuntimeTypeFromTypeNode( context, /** @type {TypeNode} */ (node) ) + } } /** @@ -483,11 +505,13 @@ function inferTypeLiteralType(node) { for (const m of node.members) { switch (m.type) { case 'TSCallSignatureDeclaration': - case 'TSConstructSignatureDeclaration': + case 'TSConstructSignatureDeclaration': { types.add('Function') break - default: + } + default: { types.add('Object') + } } } return types.size > 0 ? [...types] : ['Object'] @@ -503,16 +527,21 @@ function inferEnumType(context, node) { if (m.initializer) { if (m.initializer.type === 'Literal') { switch (typeof m.initializer.value) { - case 'string': + case 'string': { types.add('String') break + } case 'number': - case 'bigint': // Now it's a syntax error. + case 'bigint': { + // Now it's a syntax error. types.add('Number') break - case 'boolean': // Now it's a syntax error. + } + case 'boolean': { + // Now it's a syntax error. types.add('Boolean') break + } } } else { for (const type of inferRuntimeTypeFromTypeNode(