UNPKG

@croct/eslint-plugin

Version:

ESLint rules and presets applied to all Croct JavaScript projects.

60 lines (59 loc) 2.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.jsxAttributeSpacing = void 0; const createRule_1 = require("../createRule"); exports.jsxAttributeSpacing = (0, createRule_1.createRule)({ name: 'jsx-attribute-spacing', meta: { type: 'suggestion', docs: { description: 'Enforces a surrounding line break in multiline JSX attributes.', recommended: 'recommended', }, fixable: 'whitespace', schema: [], messages: { missing: 'Missing new line.', }, }, defaultOptions: [], create: context => { const sourceCode = context.getSourceCode(); function check(node) { const { value } = node; if (value === null || value.type !== 'JSXExpressionContainer') { return; } const firstToken = sourceCode.getFirstToken(value.expression); const lastToken = sourceCode.getLastToken(value.expression); if ((firstToken.type === 'Punctuator' && lastToken.type === 'Punctuator') || (firstToken.loc.start.line === lastToken.loc.end.line)) { return; } const leftBrace = sourceCode.getFirstToken(value); const rightBrace = sourceCode.getLastToken(value); const tokens = [ [leftBrace, firstToken], [lastToken, rightBrace], ]; for (const [previousToken, currentToken] of tokens) { if (previousToken.loc.end.line !== currentToken.loc.start.line) { continue; } const tokenBefore = sourceCode.getTokenBefore(currentToken, { includeComments: true }); context.report({ node: node, loc: { start: tokenBefore.loc.end, end: currentToken.loc.start, }, messageId: 'missing', fix: fixer => fixer.replaceTextRange([tokenBefore.range[1], currentToken.range[0]], '\n'), }); } } return { JSXAttribute: check, }; }, });