eslint-plugin-stylistic-compat
Version:
Compatibility version of @stylistic/eslint-plugin for Node.js >= 12 and ESLint v8
352 lines (348 loc) • 14.1 kB
JavaScript
'use strict';
var _Object$fromEntries = require('/runtime-corejs3/core-js/object/from-entries');
var _mapInstanceProperty = require('/runtime-corejs3/core-js/instance/map');
var _Object$entries = require('/runtime-corejs3/core-js/object/entries');
var utils = require('../utils.js');
require('/runtime-corejs3/core-js/instance/filter');
require('/runtime-corejs3/core-js/set');
require('/runtime-corejs3/core-js/instance/flags');
require('/runtime-corejs3/core-js/instance/includes');
require('/runtime-corejs3/core-js/instance/starts-with');
require('../vendor.js');
require('/runtime-corejs3/core-js/object/assign');
require('/runtime-corejs3/core-js/object/create');
require('/runtime-corejs3/core-js/object/freeze');
require('/runtime-corejs3/core-js/array/is-array');
require('/runtime-corejs3/core-js/instance/last-index-of');
require('/runtime-corejs3/core-js/instance/slice');
require('/runtime-corejs3/core-js/object/define-properties');
require('/runtime-corejs3/core-js/object/keys');
require('/runtime-corejs3/core-js/instance/index-of');
require('/runtime-corejs3/core-js/instance/at');
require('/runtime-corejs3/core-js/symbol');
require('/runtime-corejs3/core-js/symbol/iterator');
require('/runtime-corejs3/core-js/parse-int');
require('/runtime-corejs3/core-js/parse-float');
require('/runtime-corejs3/core-js/weak-map');
require('/runtime-corejs3/core-js/object/define-property');
require('/runtime-corejs3/core-js/global-this');
require('/runtime-corejs3/core-js/instance/for-each');
require('/runtime-corejs3/core-js/array/from');
require('eslint/use-at-your-own-risk');
require('eslint');
require('/runtime-corejs3/core-js/object/get-own-property-descriptor');
require('/runtime-corejs3/core-js/map');
require('/runtime-corejs3/core-js/instance/some');
require('/runtime-corejs3/core-js/instance/find');
require('/runtime-corejs3/core-js/instance/every');
require('/runtime-corejs3/core-js/instance/sort');
require('/runtime-corejs3/core-js/array/of');
require('/runtime-corejs3/core-js/instance/concat');
require('/runtime-corejs3/core-js/instance/entries');
require('/runtime-corejs3/core-js/instance/find-index');
require('/runtime-corejs3/core-js/instance/flat');
require('/runtime-corejs3/core-js/instance/keys');
require('/runtime-corejs3/core-js/instance/values');
require('/runtime-corejs3/core-js/object/get-own-property-names');
require('/runtime-corejs3/core-js/number/is-finite');
require('/runtime-corejs3/core-js/number/is-nan');
require('/runtime-corejs3/core-js/number/parse-float');
require('/runtime-corejs3/core-js/number/parse-int');
require('/runtime-corejs3/core-js/object/is');
require('/runtime-corejs3/core-js/object/is-extensible');
require('/runtime-corejs3/core-js/object/is-frozen');
require('/runtime-corejs3/core-js/object/is-sealed');
require('/runtime-corejs3/core-js/object/values');
require('/runtime-corejs3/core-js/string/from-code-point');
require('/runtime-corejs3/core-js/string/raw');
require('/runtime-corejs3/core-js/instance/code-point-at');
require('/runtime-corejs3/core-js/instance/ends-with');
require('/runtime-corejs3/core-js/instance/pad-end');
require('/runtime-corejs3/core-js/instance/pad-start');
require('/runtime-corejs3/core-js/instance/trim');
require('/runtime-corejs3/core-js/instance/trim-end');
require('/runtime-corejs3/core-js/instance/trim-left');
require('/runtime-corejs3/core-js/instance/trim-right');
require('/runtime-corejs3/core-js/instance/trim-start');
require('/runtime-corejs3/core-js/symbol/for');
require('/runtime-corejs3/core-js/symbol/key-for');
require('/runtime-corejs3/core-js/object/prevent-extensions');
require('/runtime-corejs3/core-js/object/seal');
require('/runtime-corejs3/core-js/object/get-prototype-of');
require('/runtime-corejs3/core-js/symbol/replace');
require('/runtime-corejs3/core-js/instance/bind');
require('/runtime-corejs3/core-js/instance/splice');
require('/runtime-corejs3/core-js/instance/repeat');
require('/runtime-corejs3/core-js/instance/reduce');
require('/runtime-corejs3/core-js/instance/reverse');
var _context2;
const commonProperties = {
multiline: {
type: "boolean"
},
minElements: {
type: "integer",
minimum: 0
},
consistent: {
type: "boolean"
}
};
const optionValueSchema = {
oneOf: [{
type: "string",
enum: ["always", "never"]
}, {
type: "object",
properties: commonProperties,
additionalProperties: false
}]
};
var Specialization = /* @__PURE__ */(Specialization2 => {
Specialization2["IfStatementConsequent"] = "IfStatementConsequent";
Specialization2["IfStatementAlternative"] = "IfStatementAlternative";
Specialization2["DoWhileStatement"] = "DoWhileStatement";
Specialization2["ForInStatement"] = "ForInStatement";
Specialization2["ForOfStatement"] = "ForOfStatement";
Specialization2["ForStatement"] = "ForStatement";
Specialization2["WhileStatement"] = "WhileStatement";
Specialization2["SwitchStatement"] = "SwitchStatement";
Specialization2["SwitchCase"] = "SwitchCase";
Specialization2["TryStatementBlock"] = "TryStatementBlock";
Specialization2["TryStatementHandler"] = "TryStatementHandler";
Specialization2["TryStatementFinalizer"] = "TryStatementFinalizer";
Specialization2["BlockStatement"] = "BlockStatement";
Specialization2["ArrowFunctionExpression"] = "ArrowFunctionExpression";
Specialization2["FunctionDeclaration"] = "FunctionDeclaration";
Specialization2["FunctionExpression"] = "FunctionExpression";
Specialization2["Property"] = "Property";
Specialization2["ClassBody"] = "ClassBody";
Specialization2["StaticBlock"] = "StaticBlock";
Specialization2["WithStatement"] = "WithStatement";
Specialization2["TSEnumBody"] = "TSEnumBody";
Specialization2["TSInterfaceBody"] = "TSInterfaceBody";
Specialization2["TSModuleBlock"] = "TSModuleBlock";
return Specialization2;
})(Specialization || {});
const presets = {
default: {
multiline: false,
minElements: Number.POSITIVE_INFINITY,
consistent: true
},
always: {
multiline: false,
minElements: 0,
consistent: false
},
never: {
multiline: false,
minElements: Number.POSITIVE_INFINITY,
consistent: false
}
};
function normalizeOptionValue(value) {
if (value === "always") {
return presets.always;
}
if (value === "never") {
return presets.never;
}
if (value) {
var _value$minElements;
return {
consistent: !!value.consistent,
minElements: (_value$minElements = value.minElements) != null ? _value$minElements : Number.POSITIVE_INFINITY,
multiline: !!value.multiline
};
}
return presets.default;
}
function normalizeOptions(options) {
var _context;
const value = normalizeOptionValue(options);
return _Object$fromEntries(_mapInstanceProperty(_context = _Object$entries(Specialization)).call(_context, ([k]) => [k, typeof options === "object" && options != null && k in options ? normalizeOptionValue(options[k]) : value]));
}
var curlyNewline = utils.createRule({
name: "curly-newline",
package: "plus",
meta: {
type: "layout",
docs: {
description: "Enforce consistent line breaks after opening and before closing braces"
},
fixable: "whitespace",
schema: [{
oneOf: [{
type: "string",
enum: ["always", "never"]
}, {
type: "object",
properties: {
..._Object$fromEntries(_mapInstanceProperty(_context2 = _Object$entries(Specialization)).call(_context2, ([k]) => [k, optionValueSchema])),
...commonProperties
},
additionalProperties: false
}]
}],
messages: {
unexpectedLinebreakBeforeClosingBrace: "Unexpected line break before this closing brace.",
unexpectedLinebreakAfterOpeningBrace: "Unexpected line break after this opening brace.",
expectedLinebreakBeforeClosingBrace: "Expected a line break before this closing brace.",
expectedLinebreakAfterOpeningBrace: "Expected a line break after this opening brace."
}
},
create(context) {
const sourceCode = context.sourceCode;
const normalizedOptions = normalizeOptions(context.options[0]);
function check(node, specialization) {
const options = normalizedOptions[specialization];
let openBrace;
let closeBrace;
let elementCount;
switch (node.type) {
case "SwitchStatement":
closeBrace = sourceCode.getLastToken(node);
openBrace = sourceCode.getTokenBefore(node.cases.length ? node.cases[0] : closeBrace);
elementCount = node.cases.length;
break;
case "StaticBlock":
openBrace = sourceCode.getFirstToken(node, token => token.value === "{");
closeBrace = sourceCode.getLastToken(node);
elementCount = node.body.length;
break;
case "TSEnumBody":
openBrace = sourceCode.getFirstToken(node);
closeBrace = sourceCode.getLastToken(node);
elementCount = node.members.length;
break;
default:
openBrace = sourceCode.getFirstToken(node);
closeBrace = sourceCode.getLastToken(node);
elementCount = node.body.length;
}
let first = sourceCode.getTokenAfter(openBrace, {
includeComments: true
});
let last = sourceCode.getTokenBefore(closeBrace, {
includeComments: true
});
const needsLineBreaks = elementCount >= options.minElements || options.multiline && elementCount > 0 && first.loc.start.line !== last.loc.end.line;
const hasCommentsFirstToken = utils.isCommentToken(first);
const hasCommentsLastToken = utils.isCommentToken(last);
first = sourceCode.getTokenAfter(openBrace);
last = sourceCode.getTokenBefore(closeBrace);
if (needsLineBreaks) {
if (utils.isTokenOnSameLine(openBrace, first)) {
context.report({
messageId: "expectedLinebreakAfterOpeningBrace",
node,
loc: openBrace.loc,
fix(fixer) {
if (hasCommentsFirstToken) return null;
return fixer.insertTextAfter(openBrace, "\n");
}
});
}
if (utils.isTokenOnSameLine(last, closeBrace)) {
context.report({
messageId: "expectedLinebreakBeforeClosingBrace",
node,
loc: closeBrace.loc,
fix(fixer) {
if (hasCommentsLastToken) return null;
return fixer.insertTextBefore(closeBrace, "\n");
}
});
}
} else {
const consistent = options.consistent;
const hasLineBreakBetweenOpenBraceAndFirst = !utils.isTokenOnSameLine(openBrace, first);
const hasLineBreakBetweenCloseBraceAndLast = !utils.isTokenOnSameLine(last, closeBrace);
if (!consistent && hasLineBreakBetweenOpenBraceAndFirst || consistent && hasLineBreakBetweenOpenBraceAndFirst && !hasLineBreakBetweenCloseBraceAndLast) {
context.report({
messageId: "unexpectedLinebreakAfterOpeningBrace",
node,
loc: openBrace.loc,
fix(fixer) {
if (hasCommentsFirstToken) return null;
return fixer.removeRange([openBrace.range[1], first.range[0]]);
}
});
}
if (!consistent && hasLineBreakBetweenCloseBraceAndLast || consistent && !hasLineBreakBetweenOpenBraceAndFirst && hasLineBreakBetweenCloseBraceAndLast) {
context.report({
messageId: "unexpectedLinebreakBeforeClosingBrace",
node,
loc: closeBrace.loc,
fix(fixer) {
if (hasCommentsLastToken) return null;
return fixer.removeRange([last.range[1], closeBrace.range[0]]);
}
});
}
}
}
function checkBlockLike(node) {
check(node, node.type);
}
return {
BlockStatement(node) {
const {
parent
} = node;
switch (parent.type) {
case "DoWhileStatement":
case "ForInStatement":
case "ForOfStatement":
case "ForStatement":
case "WhileStatement":
case "ArrowFunctionExpression":
case "FunctionDeclaration":
case "WithStatement":
check(node, parent.type);
break;
case "FunctionExpression":
if (parent.parent.type === "Property" && parent.parent.method) {
check(node, "Property");
} else {
check(node, parent.type);
}
break;
case "IfStatement":
if (node === parent.consequent) {
check(node, "IfStatementConsequent");
}
if (node === parent.alternate) {
check(node, "IfStatementAlternative");
}
break;
case "TryStatement":
if (node === parent.block) {
check(node, "TryStatementBlock");
}
if (node === parent.finalizer) {
check(node, "TryStatementFinalizer");
}
break;
case "CatchClause":
check(node, "TryStatementHandler");
break;
default:
if (parent.type === "SwitchCase" && parent.consequent.length === 1) {
check(node, "SwitchCase");
} else {
check(node, "BlockStatement");
}
}
},
SwitchStatement: checkBlockLike,
ClassBody: checkBlockLike,
StaticBlock: checkBlockLike,
TSEnumBody: checkBlockLike,
TSInterfaceBody: checkBlockLike,
TSModuleBlock: checkBlockLike
};
}
});
module.exports = curlyNewline;