Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
// Check static methods.
for (const reference of getReferences(
Object.keys(PROPERTY_TEST_TARGETS)
)) {
const node = reference.identifier
const parentNode = node.parent
if (
parentNode.type !== "MemberExpression" ||
parentNode.object !== node
) {
continue
}
const objectName = node.name
const properties = PROPERTY_TEST_TARGETS[objectName]
const propertyName = getPropertyName(parentNode)
if (
propertyName &&
properties.indexOf(propertyName) !== -1
) {
report(parentNode, `${objectName}.${propertyName}`)
}
}
// Check subclassing
for (const reference of getReferences(
SUBCLASSING_TEST_TARGETS
)) {
const node = reference.identifier
const parentNode = node.parent
if (
CLASS_TYPE.test(parentNode.type) &&
function parseRegExp(node) {
const evaluated = eslint_utils_1.getStaticValue(node, globalScope);
if (evaluated == null || !(evaluated.value instanceof RegExp)) {
return null;
}
const { pattern, flags } = regexpp_1.parseRegExpLiteral(evaluated.value);
if (pattern.alternatives.length !== 1 ||
flags.ignoreCase ||
flags.global) {
return null;
}
// Check if it can determine a unique string.
const chars = pattern.alternatives[0].elements;
if (!chars.every(c => c.type === 'Character')) {
return null;
}
// To string.
return String.fromCodePoint(...chars.map(c => c.value));
function parseRegExp(node: TSESTree.Node): string | null {
const evaluated = getStaticValue(node, globalScope);
if (evaluated == null || !(evaluated.value instanceof RegExp)) {
return null;
}
const { pattern, flags } = parseRegExpLiteral(evaluated.value);
if (
pattern.alternatives.length !== 1 ||
flags.ignoreCase ||
flags.global
) {
return null;
}
// Check if it can determine a unique string.
const chars = pattern.alternatives[0].elements;
if (!chars.every(c => c.type === 'Character')) {
NewExpression(node) {
// Only indent the arguments if the NewExpression has parens (e.g. `new Foo(bar)` or `new Foo()`, but not `new Foo`
if (node.arguments.length > 0 ||
(eslint_utils_1.isClosingParenToken(sourceCode.getLastToken(node)) &&
eslint_utils_1.isOpeningParenToken(sourceCode.getLastToken(node, 1)))) {
addFunctionCallIndent(node);
}
},
'ObjectExpression, ObjectPattern'(node) {
function getFirstToken(element) {
let token = sourceCode.getTokenBefore(element);
while (eslint_utils_1.isOpeningParenToken(token) && token !== startToken) {
token = sourceCode.getTokenBefore(token);
}
return sourceCode.getTokenAfter(token);
}
// Run through all the tokens in the list, and offset them by one indent level (mainly for comments, other things will end up overridden)
NewExpression(node) {
// Only indent the arguments if the NewExpression has parens (e.g. `new Foo(bar)` or `new Foo()`, but not `new Foo`
if (
node.arguments.length > 0 ||
(isClosingParenToken(sourceCode.getLastToken(node)!) &&
isOpeningParenToken(sourceCode.getLastToken(node, 1)!))
) {
addFunctionCallIndent(node);
}
},
function getConfigForFunction(
node:
| TSESTree.ArrowFunctionExpression
| TSESTree.FunctionDeclaration
| TSESTree.FunctionExpression,
): FuncOption {
if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {
// Always ignore non-async functions and arrow functions without parens, e.g. async foo => bar
if (
node.async &&
isOpeningParenToken(sourceCode.getFirstToken(node, { skip: 1 })!)
) {
return overrideConfig.asyncArrow ?? baseConfig;
}
} else if (isNamedFunction(node)) {
return overrideConfig.named ?? baseConfig;
// `generator-star-spacing` should warn anonymous generators. E.g. `function* () {}`
} else if (!node.generator) {
return overrideConfig.anonymous ?? baseConfig;
}
return 'ignore';
}
tokens.forEach(nextToken => {
// Accumulate a list of parenthesis pairs
if (isOpeningParenToken(nextToken)) {
parenStack.push(nextToken);
} else if (isClosingParenToken(nextToken)) {
parenPairs.unshift({ left: parenStack.pop()!, right: nextToken });
}
});
if (firstTokenOfLine.loc.start.line !== lineNumber) {
// Don't check the indentation of multi-line tokens (e.g. template literals or block comments) twice.
return;
}
// If the token matches the expected expected indentation, don't report it.
if (
validateTokenIndent(
firstTokenOfLine,
offsets.getDesiredIndent(firstTokenOfLine),
)
) {
return;
}
if (isCommentToken(firstTokenOfLine)) {
const tokenBefore = precedingTokens.get(firstTokenOfLine);
const tokenAfter = tokenBefore
? sourceCode.getTokenAfter(tokenBefore)!
: sourceCode.ast.tokens[0];
const mayAlignWithBefore =
tokenBefore &&
!hasBlankLinesBetween(tokenBefore, firstTokenOfLine);
const mayAlignWithAfter =
tokenAfter && !hasBlankLinesBetween(firstTokenOfLine, tokenAfter);
// If a comment matches the expected indentation of the token immediately before or after, don't report it.
if (
(mayAlignWithBefore &&
validateTokenIndent(
firstTokenOfLine,
sourceCode.lines.forEach((_, lineIndex) => {
const lineNumber = lineIndex + 1;
if (!tokenInfo.firstTokensByLineNumber.has(lineNumber)) {
// Don't check indentation on blank lines
return;
}
const firstTokenOfLine = tokenInfo.firstTokensByLineNumber.get(lineNumber);
if (firstTokenOfLine.loc.start.line !== lineNumber) {
// Don't check the indentation of multi-line tokens (e.g. template literals or block comments) twice.
return;
}
// If the token matches the expected expected indentation, don't report it.
if (validateTokenIndent(firstTokenOfLine, offsets.getDesiredIndent(firstTokenOfLine))) {
return;
}
if (eslint_utils_1.isCommentToken(firstTokenOfLine)) {
const tokenBefore = precedingTokens.get(firstTokenOfLine);
const tokenAfter = tokenBefore
? sourceCode.getTokenAfter(tokenBefore)
: sourceCode.ast.tokens[0];
const mayAlignWithBefore = tokenBefore &&
!hasBlankLinesBetween(tokenBefore, firstTokenOfLine);
const mayAlignWithAfter = tokenAfter && !hasBlankLinesBetween(firstTokenOfLine, tokenAfter);
// If a comment matches the expected indentation of the token immediately before or after, don't report it.
if ((mayAlignWithBefore &&
validateTokenIndent(firstTokenOfLine, offsets.getDesiredIndent(tokenBefore))) ||
(mayAlignWithAfter &&
validateTokenIndent(firstTokenOfLine, offsets.getDesiredIndent(tokenAfter)))) {
return;
}
}
// Otherwise, report the token/comment.