Skip to content
Prev Previous commit
Next Next commit
feat: add non-property nodes support
  • Loading branch information
ItMaga committed Jan 7, 2023
commit 02dbdbe84b830efce77feff130f6dee0017ab3b2
81 changes: 44 additions & 37 deletions lib/rules/padding-lines-in-component-definition.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*/

const utils = require('../utils')
const { isComment } = require('../utils/indent-utils')

const AvailablePaddingOptions = {
Never: 'never',
Expand All @@ -31,6 +32,13 @@ function isComma(node) {
return node.type === 'Punctuator' && node.value === ','
}

/**
* @param {string} nodeType
*/
function isValidProperties(nodeType) {
return ['Property', 'SpreadElement'].includes(nodeType)
}

/**
* Split the source code into multiple lines based on the line delimiters.
* @param {string} text Source code as a string.
Expand Down Expand Up @@ -64,8 +72,8 @@ function parseBooleanOption(initialOption, optionKey) {
}

/**
* @param {Property} currentProperty
* @param {Property} nextProperty
* @param {(Property | SpreadElement)} currentProperty
* @param {(Property | SpreadElement)} nextProperty
* @param {boolean} option
* @returns {boolean}
* @private/
Expand Down Expand Up @@ -157,8 +165,8 @@ module.exports = {
const sourceCode = context.getSourceCode()

/**
* @param {Property} currentProperty
* @param {Property} nextProperty
* @param {(Property | SpreadElement)} currentProperty
* @param {(Property | SpreadElement | Token)} nextProperty
* @param {RuleFixer} fixer
* */
function replaceLines(currentProperty, nextProperty, fixer) {
Expand All @@ -174,8 +182,8 @@ module.exports = {
}

/**
* @param {Property} currentProperty
* @param {Property} nextProperty
* @param {(Property | SpreadElement)} currentProperty
* @param {(Property | SpreadElement | Token)} nextProperty
* @param {RuleFixer} fixer
* @param {number} betweenLinesRange
* */
Expand All @@ -198,7 +206,7 @@ module.exports = {
}

/**
* @param {Property[]} properties
* @param {(Property | SpreadElement)[]} properties
* @param {any} option
* @param {any} nextOption
* */
Expand All @@ -212,8 +220,14 @@ module.exports = {
const nextProperty = properties[i + 1]

if (nextProperty && option !== AvailablePaddingOptions.Ignore) {
const tokenBeforeNext = sourceCode.getTokenBefore(nextProperty, {
includeComments: true
})
const isCommentBefore = isComment(tokenBeforeNext)
const reportNode = isCommentBefore ? tokenBeforeNext : nextProperty

const betweenLinesRange =
nextProperty.loc.start.line - currentProperty.loc.end.line
reportNode.loc.start.line - currentProperty.loc.end.line

if (
needGroupSingleLineProperties(
Expand All @@ -224,11 +238,11 @@ module.exports = {
) {
if (betweenLinesRange > 1) {
context.report({
node: nextProperty.key,
node: reportNode,
messageId: 'groupSingleLineProperties',
loc: nextProperty.loc,
loc: reportNode.loc,
fix(fixer) {
return replaceLines(currentProperty, nextProperty, fixer)
return replaceLines(currentProperty, reportNode, fixer)
}
})
}
Expand All @@ -240,13 +254,13 @@ module.exports = {
option === AvailablePaddingOptions.Always
) {
context.report({
node: nextProperty.key,
node: reportNode,
messageId: 'always',
loc: nextProperty.loc,
loc: reportNode.loc,
fix(fixer) {
return insertLines(
currentProperty,
nextProperty,
reportNode,
fixer,
betweenLinesRange
)
Expand All @@ -257,11 +271,11 @@ module.exports = {
option === AvailablePaddingOptions.Never
) {
context.report({
node: nextProperty.key,
node: reportNode,
messageId: 'never',
loc: nextProperty.loc,
loc: reportNode.loc,
fix(fixer) {
return replaceLines(currentProperty, nextProperty, fixer)
return replaceLines(currentProperty, reportNode, fixer)
}
})
}
Expand All @@ -270,23 +284,20 @@ module.exports = {
if (!nextOption) return

const name = /** @type {GroupName | null} */ (
utils.getStaticPropertyName(currentProperty)
currentProperty.type === 'Property' &&
utils.getStaticPropertyName(currentProperty)
)
if (!name) continue

const nestedProperties = []
for (const property of utils.iterateProperties(
currentProperty.parent,
new Set([name])
)) {
if (property.type === 'object' && property.property) {
nestedProperties.push(property.property)
}
}

const propertyOption = parseOption(nextOption, name)
if (!propertyOption) continue

const nestedProperties =
currentProperty.type === 'Property' &&
currentProperty.value.type === 'ObjectExpression' &&
currentProperty.value.properties
if (!nestedProperties) continue

verify(
nestedProperties,
parseOption(propertyOption, OptionKeys.BetweenItems),
Expand All @@ -298,22 +309,18 @@ module.exports = {
return utils.compositingVisitors(
utils.defineVueVisitor(context, {
onVueObjectEnter(node) {
const propertiesFiltered = /** @type {Property[]} */ (
node.properties.filter((property) => property.type === 'Property')
)

verify(
propertiesFiltered,
node.properties,
parseOption(options, OptionKeys.BetweenOptions),
parseOption(options, OptionKeys.WithinOption)
)
}
}),
utils.defineScriptSetupVisitor(context, {
onDefinePropsEnter(_, props) {
const propNodes = /** @type {Property[]} */ (
const propNodes = /** @type {(Property | SpreadElement)[]} */ (
props
.filter((prop) => prop.node && prop.node.type === 'Property')
.filter((prop) => prop.node && isValidProperties(prop.node.type))
.map((prop) => prop.node)
)

Expand All @@ -328,9 +335,9 @@ module.exports = {
)
},
onDefineEmitsEnter(_, emits) {
const emitNodes = /** @type {Property[]} */ (
const emitNodes = /** @type {(Property | SpreadElement)[]} */ (
emits
.filter((emit) => emit.node && emit.node.type === 'Property')
.filter((emit) => emit.node && isValidProperties(emit.node.type))
.map((emit) => emit.node)
)

Expand Down
Loading