diff --git a/src/index.js b/src/index.js index 6b3fcb77..b04c2bbe 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,4 @@ +/* eslint-disable import/max-dependencies */ import _ from 'lodash'; import recommended from './configs/recommended.json'; import arrayStyleComplexType from './rules/arrayStyleComplexType'; diff --git a/src/rules/arrayStyle/index.js b/src/rules/arrayStyle/index.js index 8f1b3b36..280c6a16 100644 --- a/src/rules/arrayStyle/index.js +++ b/src/rules/arrayStyle/index.js @@ -80,6 +80,9 @@ export default (defaultConfig, simpleType) => { return { create, + meta: { + fixable: 'code', + }, schema, }; }; diff --git a/src/rules/booleanStyle.js b/src/rules/booleanStyle.js index e18e6b34..3458879a 100644 --- a/src/rules/booleanStyle.js +++ b/src/rules/booleanStyle.js @@ -37,5 +37,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/delimiterDangle.js b/src/rules/delimiterDangle.js index 6425af83..dc179c5e 100644 --- a/src/rules/delimiterDangle.js +++ b/src/rules/delimiterDangle.js @@ -15,6 +15,31 @@ const schema = [ }, ]; +// required for reporting the correct position +const getLast = (property, indexer) => { + if (!property) { + return indexer; + } + + if (!indexer) { + return property; + } + + if (property.loc.end.line > indexer.loc.end.line) { + return property; + } + + if (indexer.loc.end.line > property.loc.end.line) { + return indexer; + } + + if (property.loc.end.column > indexer.loc.end.column) { + return property; + } + + return indexer; +}; + const create = (context) => { const option = context.options[0] || 'never'; const interfaceOption = context.options[1] || option; @@ -97,31 +122,6 @@ const create = (context) => { } }; - // required for reporting the correct position - const getLast = (property, indexer) => { - if (!property) { - return indexer; - } - - if (!indexer) { - return property; - } - - if (property.loc.end.line > indexer.loc.end.line) { - return property; - } - - if (indexer.loc.end.line > property.loc.end.line) { - return indexer; - } - - if (property.loc.end.column > indexer.loc.end.column) { - return property; - } - - return indexer; - }; - return { ObjectTypeAnnotation (node) { evaluate(node, getLast(_.last(node.properties), _.last(node.indexers))); @@ -135,5 +135,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/genericSpacing.js b/src/rules/genericSpacing.js index 0b6d7f23..d45602c5 100644 --- a/src/rules/genericSpacing.js +++ b/src/rules/genericSpacing.js @@ -90,5 +90,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/newlineAfterFlowAnnotation.js b/src/rules/newlineAfterFlowAnnotation.js index 3145db49..0433f42e 100644 --- a/src/rules/newlineAfterFlowAnnotation.js +++ b/src/rules/newlineAfterFlowAnnotation.js @@ -71,5 +71,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/noMutableArray.js b/src/rules/noMutableArray.js index f0426173..4d8a2d3c 100644 --- a/src/rules/noMutableArray.js +++ b/src/rules/noMutableArray.js @@ -58,5 +58,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/objectTypeDelimiter.js b/src/rules/objectTypeDelimiter.js index fe15a2d0..4f9059e7 100644 --- a/src/rules/objectTypeDelimiter.js +++ b/src/rules/objectTypeDelimiter.js @@ -66,5 +66,8 @@ const schema = [ export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/requireIndexerName.js b/src/rules/requireIndexerName.js index 43ee1f02..4c0ae7b1 100644 --- a/src/rules/requireIndexerName.js +++ b/src/rules/requireIndexerName.js @@ -33,5 +33,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/requireReadonlyReactProps.js b/src/rules/requireReadonlyReactProps.js index 8d24d9c4..978861b3 100644 --- a/src/rules/requireReadonlyReactProps.js +++ b/src/rules/requireReadonlyReactProps.js @@ -21,6 +21,27 @@ const isReactComponent = (node) => { ); }; +const isReadOnlyObjectType = (node) => { + if (!node || node.type !== 'ObjectTypeAnnotation') { + return false; + } + + // we consider `{||}` to be ReadOnly since it's exact AND has no props + if (node.exact && node.properties.length === 0) { + return true; + } + + // { +foo: ..., +bar: ..., ... } + return node.properties.length > 0 && + node.properties.every((prop) => { + return prop.variance && prop.variance.kind === 'plus'; + }); +}; + +const isReadOnlyType = (node) => { + return node.right.id && reReadOnly.test(node.right.id.name) || isReadOnlyObjectType(node.right); +}; + const create = (context) => { const readOnlyTypes = []; const foundTypes = []; @@ -32,27 +53,6 @@ const create = (context) => { return id && !reReadOnly.test(id.name) && !readOnlyTypes.includes(id.name) && foundTypes.includes(id.name); }; - const isReadOnlyObjectType = (node) => { - if (!node || node.type !== 'ObjectTypeAnnotation') { - return false; - } - - // we consider `{||}` to be ReadOnly since it's exact AND has no props - if (node.exact && node.properties.length === 0) { - return true; - } - - // { +foo: ..., +bar: ..., ... } - return node.properties.length > 0 && - node.properties.every((prop) => { - return prop.variance && prop.variance.kind === 'plus'; - }); - }; - - const isReadOnlyType = (node) => { - return node.right.id && reReadOnly.test(node.right.id.name) || isReadOnlyObjectType(node.right); - }; - for (const node of context.getSourceCode().ast.body) { let idName; let typeNode; diff --git a/src/rules/requireReturnType.js b/src/rules/requireReturnType.js index cc230e69..0227cbed 100644 --- a/src/rules/requireReturnType.js +++ b/src/rules/requireReturnType.js @@ -35,15 +35,19 @@ const schema = [ }, ]; +const makeRegExp = (str) => { + return new RegExp(str); +}; + +const isUndefinedReturnType = (returnNode) => { + return returnNode.argument === null || returnNode.argument.name === 'undefined' || returnNode.argument.operator === 'void'; +}; + const create = (context) => { const annotateReturn = (_.get(context, 'options[0]') || 'always') === 'always'; const annotateUndefined = _.get(context, 'options[1].annotateUndefined') || 'never'; const skipArrows = _.get(context, 'options[1].excludeArrowFunctions') || false; - const makeRegExp = (str) => { - return new RegExp(str); - }; - const excludeMatching = _.get(context, 'options[1].excludeMatching', []).map(makeRegExp); const includeOnlyMatching = _.get(context, 'options[1].includeOnlyMatching', []).map(makeRegExp); @@ -55,12 +59,9 @@ const create = (context) => { }); }; - const isUndefinedReturnType = (returnNode) => { - return returnNode.argument === null || returnNode.argument.name === 'undefined' || returnNode.argument.operator === 'void'; - }; - const getIsReturnTypeAnnotationUndefined = (targetNode) => { - const isReturnTypeAnnotationLiteralUndefined = _.get(targetNode, 'functionNode.returnType.typeAnnotation.id.name') === 'undefined' && _.get(targetNode, 'functionNode.returnType.typeAnnotation.type') === 'GenericTypeAnnotation'; + const isReturnTypeAnnotationLiteralUndefined = _.get(targetNode, 'functionNode.returnType.typeAnnotation.id.name') === 'undefined' && + _.get(targetNode, 'functionNode.returnType.typeAnnotation.type') === 'GenericTypeAnnotation'; const isReturnTypeAnnotationVoid = _.get(targetNode, 'functionNode.returnType.typeAnnotation.type') === 'VoidTypeAnnotation'; const isAsyncReturnTypeAnnotationVoid = _.get(targetNode, 'functionNode.async') && _.get(targetNode, 'functionNode.returnType.typeAnnotation.id.name') === 'Promise' && ( @@ -113,7 +114,10 @@ const create = (context) => { const isArrow = functionNode.type === 'ArrowFunctionExpression'; const isArrowFunctionExpression = functionNode.expression; - const isFunctionReturnUndefined = !isArrowFunctionExpression && !functionNode.generator && (!targetNode.returnStatementNode || isUndefinedReturnType(targetNode.returnStatementNode)); + const isFunctionReturnUndefined = + !isArrowFunctionExpression && + !functionNode.generator && + (!targetNode.returnStatementNode || isUndefinedReturnType(targetNode.returnStatementNode)); const isReturnTypeAnnotationUndefined = getIsReturnTypeAnnotationUndefined(targetNode); if (skipArrows === 'expressionsOnly' && isArrowFunctionExpression || skipArrows === true && isArrow || shouldFilterNode(functionNode)) { diff --git a/src/rules/requireValidFileAnnotation.js b/src/rules/requireValidFileAnnotation.js index fb0f6ae7..d303c76a 100644 --- a/src/rules/requireValidFileAnnotation.js +++ b/src/rules/requireValidFileAnnotation.js @@ -156,5 +156,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/semi.js b/src/rules/semi.js index 3204efe0..19267c8e 100644 --- a/src/rules/semi.js +++ b/src/rules/semi.js @@ -5,6 +5,10 @@ const schema = [ }, ]; +const isSemicolon = (token) => { + return token.type === 'Punctuator' && token.value === ';'; +}; + const create = (context) => { const never = (context.options[0] || 'always') === 'never'; const sourceCode = context.getSourceCode(); @@ -37,10 +41,6 @@ const create = (context) => { }); }; - const isSemicolon = (token) => { - return token.type === 'Punctuator' && token.value === ';'; - }; - const checkForSemicolon = (node) => { const lastToken = sourceCode.getLastToken(node); const isLastTokenSemicolon = isSemicolon(lastToken); @@ -67,5 +67,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/sortKeys.js b/src/rules/sortKeys.js index a8d7e2a5..ca37a887 100644 --- a/src/rules/sortKeys.js +++ b/src/rules/sortKeys.js @@ -220,5 +220,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/spaceAfterTypeColon.js b/src/rules/spaceAfterTypeColon.js index 0c202422..3e888e90 100644 --- a/src/rules/spaceAfterTypeColon.js +++ b/src/rules/spaceAfterTypeColon.js @@ -26,5 +26,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/spaceBeforeGenericBracket.js b/src/rules/spaceBeforeGenericBracket.js index d958b882..7a796a8c 100644 --- a/src/rules/spaceBeforeGenericBracket.js +++ b/src/rules/spaceBeforeGenericBracket.js @@ -55,5 +55,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/spaceBeforeTypeColon.js b/src/rules/spaceBeforeTypeColon.js index 20c2610d..95f781a8 100644 --- a/src/rules/spaceBeforeTypeColon.js +++ b/src/rules/spaceBeforeTypeColon.js @@ -15,5 +15,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/typeImportStyle.js b/src/rules/typeImportStyle.js index b96a3d97..d8d8ae9b 100644 --- a/src/rules/typeImportStyle.js +++ b/src/rules/typeImportStyle.js @@ -87,5 +87,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/rules/unionIntersectionSpacing.js b/src/rules/unionIntersectionSpacing.js index 785f92b2..09b5a6f2 100644 --- a/src/rules/unionIntersectionSpacing.js +++ b/src/rules/unionIntersectionSpacing.js @@ -75,5 +75,8 @@ const create = (context) => { export default { create, + meta: { + fixable: 'code', + }, schema, }; diff --git a/src/utilities/checkFlowFileAnnotation.js b/src/utilities/checkFlowFileAnnotation.js index 48a32245..0ab92f6f 100644 --- a/src/utilities/checkFlowFileAnnotation.js +++ b/src/utilities/checkFlowFileAnnotation.js @@ -9,5 +9,6 @@ export default (cb, context) => { return () => {}; } + // eslint-disable-next-line promise/prefer-await-to-callbacks -- not a promise callback return cb(context); }; diff --git a/src/utilities/fuzzyStringMatch.js b/src/utilities/fuzzyStringMatch.js index e789298f..d90cf199 100644 --- a/src/utilities/fuzzyStringMatch.js +++ b/src/utilities/fuzzyStringMatch.js @@ -14,35 +14,34 @@ const arrayPairs = (array) => { return pairs; }; -/* eslint-enable */ -export default (needle, haystack, weight = 0.5) => { - // Based on http://stackoverflow.com/a/23305385 - - const stringSimilarity = (str1, str2) => { - if (str1.length > 0 && str2.length > 0) { - const pairs1 = arrayPairs(str1); - const pairs2 = arrayPairs(str2); - const unionLen = pairs1.length + pairs2.length; - let hitCount; - - hitCount = 0; - - _.forIn(pairs1, (val1) => { - _.forIn(pairs2, (val2) => { - if (_.isEqual(val1, val2)) { - hitCount++; - } - }); +// Based on http://stackoverflow.com/a/23305385 + +const stringSimilarity = (str1, str2) => { + if (str1.length > 0 && str2.length > 0) { + const pairs1 = arrayPairs(str1); + const pairs2 = arrayPairs(str2); + const unionLen = pairs1.length + pairs2.length; + let hitCount; + + hitCount = 0; + + _.forIn(pairs1, (val1) => { + _.forIn(pairs2, (val2) => { + if (_.isEqual(val1, val2)) { + hitCount++; + } }); + }); - if (hitCount > 0) { - return 2 * hitCount / unionLen; - } + if (hitCount > 0) { + return 2 * hitCount / unionLen; } + } - return 0; - }; + return 0; +}; +export default (needle, haystack, weight = 0.5) => { return stringSimilarity(needle, haystack) >= Number(weight); };