eslint-plugin-stylistic-compat
Version:
Compatibility version of @stylistic/eslint-plugin for Node.js >= 12 and ESLint v8
252 lines (248 loc) • 11.1 kB
JavaScript
'use strict';
var _sliceInstanceProperty = require('/runtime-corejs3/core-js/instance/slice');
var _replaceAllInstanceProperty = require('/runtime-corejs3/core-js/instance/replace-all');
var _trimStartInstanceProperty = require('/runtime-corejs3/core-js/instance/trim-start');
var _trimEndInstanceProperty = require('/runtime-corejs3/core-js/instance/trim-end');
var utils = require('../utils.js');
var vendor = require('../vendor.js');
require('/runtime-corejs3/core-js/object/from-entries');
require('/runtime-corejs3/core-js/instance/map');
require('/runtime-corejs3/core-js/instance/filter');
require('/runtime-corejs3/core-js/object/entries');
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('/runtime-corejs3/core-js/array/from');
require('/runtime-corejs3/core-js/array/is-array');
require('/runtime-corejs3/core-js/instance/concat');
require('/runtime-corejs3/core-js/object/keys');
require('/runtime-corejs3/core-js/instance/reduce');
require('/runtime-corejs3/core-js/object/assign');
require('/runtime-corejs3/core-js/instance/keys');
require('/runtime-corejs3/core-js/instance/find');
require('/runtime-corejs3/core-js/instance/reverse');
require('/runtime-corejs3/core-js/object/define-property');
require('/runtime-corejs3/core-js/object/create');
require('/runtime-corejs3/core-js/object/freeze');
require('/runtime-corejs3/core-js/instance/last-index-of');
require('/runtime-corejs3/core-js/object/define-properties');
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/global-this');
require('/runtime-corejs3/core-js/instance/for-each');
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/every');
require('/runtime-corejs3/core-js/instance/sort');
require('/runtime-corejs3/core-js/array/of');
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/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-left');
require('/runtime-corejs3/core-js/instance/trim-right');
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');
var functionCallSpacing = utils.createRule({
name: "function-call-spacing",
package: "ts",
meta: {
type: "layout",
docs: {
description: "Require or disallow spacing between function identifiers and their invocations"
},
fixable: "whitespace",
schema: {
anyOf: [{
type: "array",
items: [{
type: "string",
enum: ["never"]
}],
minItems: 0,
maxItems: 1
}, {
type: "array",
items: [{
type: "string",
enum: ["always"]
}, {
type: "object",
properties: {
allowNewlines: {
type: "boolean"
},
optionalChain: {
type: "object",
properties: {
before: {
type: "boolean"
},
after: {
type: "boolean"
}
},
additionalProperties: false
}
},
additionalProperties: false
}],
minItems: 0,
maxItems: 2
}]
},
messages: {
unexpectedWhitespace: "Unexpected whitespace between function name and paren.",
unexpectedNewline: "Unexpected newline between function name and paren.",
missing: "Missing space between function name and paren."
}
},
defaultOptions: ["never", {}],
create(context, [option, config]) {
const sourceCode = context.sourceCode;
const text = sourceCode.getText();
const {
allowNewlines = false,
optionalChain = {
before: true,
after: true
}
} = config;
function checkSpacing(node, leftToken, rightToken) {
const isOptionalCall = vendor.astUtilsExports.isOptionalCallExpression(node);
const textBetweenTokens = _sliceInstanceProperty(text).call(text, leftToken.range[1], rightToken.range[0]).replace(/\/\*.*?\*\//gu, "");
const hasWhitespace = /\s/u.test(textBetweenTokens);
const hasNewline = hasWhitespace && vendor.astUtilsExports.LINEBREAK_MATCHER.test(textBetweenTokens);
if (option === "never") {
if (hasWhitespace) {
return context.report({
node,
loc: {
start: leftToken.loc.end,
end: rightToken.loc.start
},
messageId: "unexpectedWhitespace",
fix(fixer) {
if (sourceCode.commentsExistBetween(leftToken, rightToken)) return null;
if (isOptionalCall) {
return fixer.replaceTextRange([leftToken.range[1], rightToken.range[0]], "?.");
}
return fixer.removeRange([leftToken.range[1], rightToken.range[0]]);
}
});
}
} else if (isOptionalCall) {
const {
before: beforeOptionChain = true,
after: afterOptionChain = true
} = optionalChain;
const hasPrefixSpace = /^\s/u.test(textBetweenTokens);
const hasSuffixSpace = /\s$/u.test(textBetweenTokens);
const hasCorrectPrefixSpace = beforeOptionChain ? hasPrefixSpace : !hasPrefixSpace;
const hasCorrectSuffixSpace = afterOptionChain ? hasSuffixSpace : !hasSuffixSpace;
const hasCorrectNewline = allowNewlines || !hasNewline;
if (!hasCorrectPrefixSpace || !hasCorrectSuffixSpace || !hasCorrectNewline) {
const messageId = !hasCorrectNewline ? "unexpectedNewline" : !beforeOptionChain && hasPrefixSpace || !afterOptionChain && hasSuffixSpace ? "unexpectedWhitespace" : "missing";
context.report({
node,
loc: {
start: leftToken.loc.end,
end: rightToken.loc.start
},
messageId,
fix(fixer) {
if (sourceCode.commentsExistBetween(leftToken, rightToken)) return null;
let text2 = textBetweenTokens;
if (!allowNewlines) {
const GLOBAL_LINEBREAK_MATCHER = new RegExp(vendor.astUtilsExports.LINEBREAK_MATCHER.source, "g");
text2 = _replaceAllInstanceProperty(text2).call(text2, GLOBAL_LINEBREAK_MATCHER, " ");
}
if (!hasCorrectPrefixSpace) text2 = beforeOptionChain ? ` ${text2}` : _trimStartInstanceProperty(text2).call(text2);
if (!hasCorrectSuffixSpace) text2 = afterOptionChain ? `${text2} ` : _trimEndInstanceProperty(text2).call(text2);
return fixer.replaceTextRange([leftToken.range[1], rightToken.range[0]], text2);
}
});
}
} else {
if (!hasWhitespace) {
context.report({
node,
loc: {
start: leftToken.loc.end,
end: rightToken.loc.start
},
messageId: "missing",
fix(fixer) {
return fixer.insertTextBefore(rightToken, " ");
}
});
} else if (!allowNewlines && hasNewline) {
context.report({
node,
loc: {
start: leftToken.loc.end,
end: rightToken.loc.start
},
messageId: "unexpectedNewline",
fix(fixer) {
if (sourceCode.commentsExistBetween(leftToken, rightToken)) return null;
return fixer.replaceTextRange([leftToken.range[1], rightToken.range[0]], " ");
}
});
}
}
}
return {
"CallExpression, NewExpression": function (node) {
var _node$typeArguments;
const closingParenToken = sourceCode.getLastToken(node);
const lastCalleeTokenWithoutPossibleParens = sourceCode.getLastToken((_node$typeArguments = node.typeArguments) != null ? _node$typeArguments : node.callee);
const openingParenToken = sourceCode.getFirstTokenBetween(lastCalleeTokenWithoutPossibleParens, closingParenToken, vendor.astUtilsExports.isOpeningParenToken);
if (!openingParenToken || openingParenToken.range[1] >= node.range[1]) {
return;
}
const lastCalleeToken = sourceCode.getTokenBefore(openingParenToken, vendor.astUtilsExports.isNotOptionalChainPunctuator);
checkSpacing(node, lastCalleeToken, openingParenToken);
},
ImportExpression(node) {
const leftToken = sourceCode.getFirstToken(node);
const rightToken = sourceCode.getTokenAfter(leftToken);
checkSpacing(node, leftToken, rightToken);
}
};
}
});
module.exports = functionCallSpacing;