@stylistic/eslint-plugin-js
Version:
JavaScript stylistic rules for ESLint, migrated from [eslint core](https://github.com/eslint/eslint).
105 lines (102 loc) • 3.34 kB
JavaScript
import { c as createRule, i as isTokenOnSameLine } from '../utils.js';
import 'eslint-visitor-keys';
import 'espree';
var blockSpacing = createRule({
name: "block-spacing",
package: "js",
meta: {
type: "layout",
docs: {
description: "Disallow or enforce spaces inside of blocks after opening block and before closing block"
},
fixable: "whitespace",
schema: [
{ type: "string", enum: ["always", "never"] }
],
messages: {
missing: "Requires a space {{location}} '{{token}}'.",
extra: "Unexpected space(s) {{location}} '{{token}}'."
}
},
create(context) {
const always = context.options[0] !== "never";
const messageId = always ? "missing" : "extra";
const sourceCode = context.sourceCode;
function getOpenBrace(node) {
if (node.type === "SwitchStatement") {
if (node.cases.length > 0)
return sourceCode.getTokenBefore(node.cases[0]);
return sourceCode.getLastToken(node, 1);
}
if (node.type === "StaticBlock")
return sourceCode.getFirstToken(node, { skip: 1 });
return sourceCode.getFirstToken(node);
}
function isValid(left, right) {
return !isTokenOnSameLine(left, right) || sourceCode.isSpaceBetween(left, right) === always;
}
function checkSpacingInsideBraces(node) {
const openBrace = getOpenBrace(node);
const closeBrace = sourceCode.getLastToken(node);
const firstToken = sourceCode.getTokenAfter(openBrace, { includeComments: true });
const lastToken = sourceCode.getTokenBefore(closeBrace, { includeComments: true });
if (openBrace.type !== "Punctuator" || openBrace.value !== "{" || closeBrace.type !== "Punctuator" || closeBrace.value !== "}" || firstToken === closeBrace) {
return;
}
if (!always && firstToken.type === "Line")
return;
if (!isValid(openBrace, firstToken)) {
let loc = openBrace.loc;
if (messageId === "extra") {
loc = {
start: openBrace.loc.end,
end: firstToken.loc.start
};
}
context.report({
node,
loc,
messageId,
data: {
location: "after",
token: openBrace.value
},
fix(fixer) {
if (always)
return fixer.insertTextBefore(firstToken, " ");
return fixer.removeRange([openBrace.range[1], firstToken.range[0]]);
}
});
}
if (!isValid(lastToken, closeBrace)) {
let loc = closeBrace.loc;
if (messageId === "extra") {
loc = {
start: lastToken.loc.end,
end: closeBrace.loc.start
};
}
context.report({
node,
loc,
messageId,
data: {
location: "before",
token: closeBrace.value
},
fix(fixer) {
if (always)
return fixer.insertTextAfter(lastToken, " ");
return fixer.removeRange([lastToken.range[1], closeBrace.range[0]]);
}
});
}
}
return {
BlockStatement: checkSpacingInsideBraces,
StaticBlock: checkSpacingInsideBraces,
SwitchStatement: checkSpacingInsideBraces
};
}
});
export { blockSpacing as default };