remove typescript dependency from boolean-trivia, no-double-space rules
This commit is contained in:
parent
8442ec01bf
commit
2b11a18d6a
|
@ -1,6 +1,5 @@
|
|||
import { SyntaxKind } from "typescript";
|
||||
import { AST_NODE_TYPES, TSESTree } from "@typescript-eslint/experimental-utils";
|
||||
import { getEsTreeNodeToTSNodeMap, createRule } from "./utils";
|
||||
import { createRule } from "./utils";
|
||||
|
||||
export = createRule({
|
||||
name: "boolean-trivia",
|
||||
|
@ -20,19 +19,21 @@ export = createRule({
|
|||
defaultOptions: [],
|
||||
|
||||
create(context) {
|
||||
const esTreeNodeToTSNodeMap = getEsTreeNodeToTSNodeMap(context.parserServices);
|
||||
const sourceCode = context.getSourceCode();
|
||||
const sourceCodeText = sourceCode.getText();
|
||||
|
||||
const isSetOrAssert = (name: string): boolean => name.startsWith("set") || name.startsWith("assert");
|
||||
const isTrivia = (node: TSESTree.Expression): boolean => {
|
||||
const tsNode = esTreeNodeToTSNodeMap.get(node);
|
||||
|
||||
if (tsNode.kind === SyntaxKind.Identifier) {
|
||||
return tsNode.originalKeywordKind === SyntaxKind.UndefinedKeyword;
|
||||
if (node.type === AST_NODE_TYPES.Identifier) {
|
||||
return node.name === "undefined";
|
||||
}
|
||||
|
||||
return [SyntaxKind.TrueKeyword, SyntaxKind.FalseKeyword, SyntaxKind.NullKeyword].indexOf(tsNode.kind) >= 0;
|
||||
if (node.type === AST_NODE_TYPES.Literal) {
|
||||
// eslint-disable-next-line no-null/no-null
|
||||
return node.value === null || node.value === true || node.value === false;
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
const shouldIgnoreCalledExpression = (node: TSESTree.CallExpression): boolean => {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import { TSESTree } from "@typescript-eslint/experimental-utils";
|
||||
import { SyntaxKind } from "typescript";
|
||||
import { getEsTreeNodeToTSNodeMap, createRule } from "./utils";
|
||||
import { TSESTree, AST_NODE_TYPES } from "@typescript-eslint/experimental-utils";
|
||||
import { createRule } from "./utils";
|
||||
|
||||
export = createRule({
|
||||
name: "no-double-space",
|
||||
|
@ -19,28 +18,19 @@ export = createRule({
|
|||
defaultOptions: [],
|
||||
|
||||
create(context) {
|
||||
const esTreeNodeToTSNodeMap = getEsTreeNodeToTSNodeMap(context.parserServices);
|
||||
const sourceCode = context.getSourceCode();
|
||||
const lines = sourceCode.getLines();
|
||||
|
||||
const isLiteral = (node: TSESTree.Node | null) => {
|
||||
if (!node) {
|
||||
return false;
|
||||
}
|
||||
const isStringLiteral = (node: TSESTree.Node | null): boolean => {
|
||||
return !!(node && (
|
||||
(node.type === AST_NODE_TYPES.TemplateElement) ||
|
||||
(node.type === AST_NODE_TYPES.TemplateLiteral && node.quasis) ||
|
||||
(node.type === AST_NODE_TYPES.Literal && typeof node.value === "string")
|
||||
));
|
||||
};
|
||||
|
||||
const tsNode = esTreeNodeToTSNodeMap.get(node);
|
||||
if (!tsNode) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return [
|
||||
SyntaxKind.NoSubstitutionTemplateLiteral,
|
||||
SyntaxKind.RegularExpressionLiteral,
|
||||
SyntaxKind.TemplateMiddle,
|
||||
SyntaxKind.StringLiteral,
|
||||
SyntaxKind.TemplateHead,
|
||||
SyntaxKind.TemplateTail,
|
||||
].indexOf(tsNode.kind) >= 0;
|
||||
const isRegexLiteral = (node: TSESTree.Node | null): boolean => {
|
||||
return !!(node && node.type === AST_NODE_TYPES.Literal && node.regex);
|
||||
};
|
||||
|
||||
const checkDoubleSpace = (node: TSESTree.Node) => {
|
||||
|
@ -66,7 +56,7 @@ export = createRule({
|
|||
|
||||
const locIndex = sourceCode.getIndexFromLoc({ column: doubleSpace.index, line: index + 1 });
|
||||
const sourceNode = sourceCode.getNodeByRangeIndex(locIndex);
|
||||
if (isLiteral(sourceNode)) {
|
||||
if (isStringLiteral(sourceNode) || isRegexLiteral(sourceNode)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,18 +1,2 @@
|
|||
import { ParserServices, ESLintUtils } from "@typescript-eslint/experimental-utils";
|
||||
import { ESLintUtils } from "@typescript-eslint/experimental-utils";
|
||||
export const createRule = ESLintUtils.RuleCreator(() => "");
|
||||
|
||||
export const getTypeChecker = (parserServices: ParserServices | undefined) => {
|
||||
if (!parserServices || !parserServices.program || !parserServices.program.getTypeChecker) {
|
||||
throw new Error("'typeChecker' was not found");
|
||||
}
|
||||
|
||||
return parserServices.program.getTypeChecker();
|
||||
};
|
||||
|
||||
export const getEsTreeNodeToTSNodeMap = (parserServices: ParserServices | undefined) => {
|
||||
if (!parserServices || !parserServices.esTreeNodeToTSNodeMap) {
|
||||
throw new Error("'esTreeNodeToTSNodeMap' was not found");
|
||||
}
|
||||
|
||||
return parserServices.esTreeNodeToTSNodeMap;
|
||||
};
|
||||
|
|
|
@ -1,14 +1,9 @@
|
|||
import { RuleTester, ROOT_DIR, FILENAME } from "./support/RuleTester";
|
||||
import { RuleTester } from "./support/RuleTester";
|
||||
import rule = require("../rules/boolean-trivia");
|
||||
|
||||
const ruleTester = new RuleTester({
|
||||
parserOptions: {
|
||||
warnOnUnsupportedTypeScriptVersion: false,
|
||||
tsconfigRootDir: ROOT_DIR,
|
||||
ecmaFeatures: {},
|
||||
ecmaVersion: 6,
|
||||
sourceType: "module",
|
||||
project: "./tsconfig.json",
|
||||
},
|
||||
parser: require.resolve("@typescript-eslint/parser"),
|
||||
});
|
||||
|
@ -16,28 +11,30 @@ const ruleTester = new RuleTester({
|
|||
ruleTester.run("boolean-trivia", rule, {
|
||||
valid: [
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: boolean) => {};
|
||||
fn(/* boolean prop */ true);
|
||||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: null) => {};
|
||||
fn(/* null prop */ null);
|
||||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: undefined) => {};
|
||||
fn(/* undefined prop */ undefined);
|
||||
`,
|
||||
},
|
||||
{
|
||||
code: `
|
||||
const fn = (prop: null) => {};
|
||||
fn(/*null prop*/ null);
|
||||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: boolean) => {};
|
||||
fn(/* comment */
|
||||
|
@ -46,7 +43,6 @@ fn(/* comment */
|
|||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: boolean) => {};
|
||||
fn.apply(null, true);
|
||||
|
@ -56,7 +52,6 @@ fn.apply(null, true);
|
|||
|
||||
invalid: [
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: null) => {};
|
||||
fn(null);
|
||||
|
@ -64,7 +59,6 @@ fn(null);
|
|||
errors: [{ messageId: "booleanTriviaArgumentError" }],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: boolean) => {};
|
||||
fn(false);
|
||||
|
@ -72,7 +66,6 @@ fn(false);
|
|||
errors: [{ messageId: "booleanTriviaArgumentError" }],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: boolean) => {};
|
||||
fn(/* boolean arg */false);
|
||||
|
@ -80,7 +73,6 @@ fn(/* boolean arg */false);
|
|||
errors: [{ messageId: "booleanTriviaArgumentSpaceError" }],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const fn = (prop: boolean) => {};
|
||||
fn(/* first comment */ /* second comment */ false);
|
||||
|
|
0
scripts/eslint/tests/fixtures/file.ts
vendored
0
scripts/eslint/tests/fixtures/file.ts
vendored
9
scripts/eslint/tests/fixtures/tsconfig.json
vendored
9
scripts/eslint/tests/fixtures/tsconfig.json
vendored
|
@ -1,9 +0,0 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"esModuleInterop": true,
|
||||
"target": "es5",
|
||||
"module": "commonjs",
|
||||
"strict": true,
|
||||
"lib": ["es2015", "es2017", "esnext"],
|
||||
}
|
||||
}
|
|
@ -1,85 +1,64 @@
|
|||
import { RuleTester, ROOT_DIR, FILENAME } from "./support/RuleTester";
|
||||
import { RuleTester } from "./support/RuleTester";
|
||||
import rule = require("../rules/no-double-space");
|
||||
|
||||
const ruleTester = new RuleTester({
|
||||
parser: require.resolve("@typescript-eslint/parser"),
|
||||
parserOptions: {
|
||||
warnOnUnsupportedTypeScriptVersion: false,
|
||||
tsconfigRootDir: ROOT_DIR,
|
||||
ecmaFeatures: {},
|
||||
ecmaVersion: 6,
|
||||
sourceType: "module",
|
||||
project: "./tsconfig.json",
|
||||
},
|
||||
});
|
||||
|
||||
ruleTester.run("no-double-space", rule, {
|
||||
valid: [
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `const a = {};`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `function fn() {}`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `const a = " ";`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `// ^ ^`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `class Cl {}`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `// comment `,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `/* comment */`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `" string ";`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `/ regexp /g;`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `const rgx = / regexp /g;`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: "const str = ` string template`;",
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: ` // comment`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: ` /* comment */`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `// `,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const a =
|
||||
1;
|
||||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
/**
|
||||
* comment
|
||||
|
@ -87,7 +66,6 @@ const a =
|
|||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
// comment
|
||||
// - comment
|
||||
|
@ -95,7 +73,6 @@ const a =
|
|||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
interface Props {
|
||||
prop: string[]; // comment prop
|
||||
|
@ -104,7 +81,6 @@ interface Props {
|
|||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
/**
|
||||
* Returns a JSON-encoded value of the type: string[]
|
||||
|
@ -115,7 +91,6 @@ interface Props {
|
|||
`,
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const obj = {
|
||||
content: "function f() { 1; }",
|
||||
|
@ -126,54 +101,46 @@ const obj = {
|
|||
|
||||
invalid: [
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `const a = {};`,
|
||||
errors: [
|
||||
{ messageId: "noDoubleSpaceError", line: 1, column: 6 },
|
||||
],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `function fn() {}`,
|
||||
errors: [
|
||||
{ messageId: "noDoubleSpaceError", line: 1, column: 9 },
|
||||
],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `class Cl {}`,
|
||||
errors: [{ messageId: "noDoubleSpaceError", line: 1, column: 6 }],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: "const str = ` string template`;",
|
||||
errors: [
|
||||
{ messageId: "noDoubleSpaceError", line: 1, column: 12 },
|
||||
],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `/** comment */`,
|
||||
errors: [
|
||||
{ messageId: "noDoubleSpaceError", line: 1, column: 12 },
|
||||
],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `/** comment with many spaces */`,
|
||||
errors: [
|
||||
{ messageId: "noDoubleSpaceError", line: 1, column: 12 },
|
||||
],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `// comment with many spaces`,
|
||||
errors: [
|
||||
{ messageId: "noDoubleSpaceError", line: 1, column: 11 },
|
||||
],
|
||||
},
|
||||
{
|
||||
filename: FILENAME,
|
||||
code: `
|
||||
const a = 1;
|
||||
const b = 2;
|
||||
|
|
|
@ -23,9 +23,5 @@
|
|||
"include": [
|
||||
"rules",
|
||||
"tests"
|
||||
],
|
||||
|
||||
"exclude": [
|
||||
"fixtures"
|
||||
]
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue