react-scripts
Version:
Configuration and scripts for Create React App.
223 lines (175 loc) • 7.95 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _utilities = require('./../utilities');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var parseOptions = function parseOptions(context) {
return {
always: (context.options[0] || 'always') === 'always'
};
};
var propertyEvaluator = function propertyEvaluator(context, typeForMessage) {
var _parseOptions = parseOptions(context);
var always = _parseOptions.always;
var sourceCode = context.getSourceCode();
var getSpacesAfterColon = function getSpacesAfterColon(node, typeAnnotation) {
if (node.type === 'FunctionTypeParam') {
var colon = sourceCode.getFirstToken(node, node.optional ? 2 : 1);
return {
colon: colon,
spaceAfter: sourceCode.getTokenAfter(colon).start - colon.end
};
} else {
var _sourceCode$getFirstT = sourceCode.getFirstTokens(typeAnnotation, 2);
var _sourceCode$getFirstT2 = _slicedToArray(_sourceCode$getFirstT, 2);
var _colon = _sourceCode$getFirstT2[0];
var token = _sourceCode$getFirstT2[1];
return {
colon: _colon,
spaceAfter: token.start - typeAnnotation.start - 1
};
}
};
return function (node) {
var typeAnnotation = _lodash2.default.get(node, 'typeAnnotation') || _lodash2.default.get(node, 'left.typeAnnotation');
if (typeAnnotation) {
var _getSpacesAfterColon = getSpacesAfterColon(node, typeAnnotation);
var colon = _getSpacesAfterColon.colon;
var spaceAfter = _getSpacesAfterColon.spaceAfter;
var data = {
name: (0, _utilities.quoteName)((0, _utilities.getParameterName)(node, context)),
type: typeForMessage
};
if (always && spaceAfter > 1) {
context.report({
data: data,
fix: _utilities.spacingFixers.stripSpacesAfter(colon, spaceAfter - 1),
message: 'There must be 1 space after {{name}}{{type}} type annotation colon.',
node: node
});
} else if (always && spaceAfter === 0) {
context.report({
data: data,
fix: _utilities.spacingFixers.addSpaceAfter(colon),
message: 'There must be a space after {{name}}{{type}} type annotation colon.',
node: node
});
} else if (!always && spaceAfter > 0) {
context.report({
data: data,
fix: _utilities.spacingFixers.stripSpacesAfter(colon, spaceAfter),
message: 'There must be no space after {{name}}{{type}} type annotation colon.',
node: node
});
}
}
};
};
var returnTypeEvaluator = function returnTypeEvaluator(context) {
var _parseOptions2 = parseOptions(context);
var always = _parseOptions2.always;
var sourceCode = context.getSourceCode();
return function (functionNode) {
// skip FunctionTypeAnnotation, possibly another rule as it's an arrow, not a colon?
// (foo: number) => string
// ^^^^
if (functionNode.returnType && functionNode.type !== 'FunctionTypeAnnotation') {
var _sourceCode$getFirstT3 = sourceCode.getFirstTokens(functionNode.returnType, 2);
var _sourceCode$getFirstT4 = _slicedToArray(_sourceCode$getFirstT3, 2);
var colon = _sourceCode$getFirstT4[0];
var token = _sourceCode$getFirstT4[1];
var spaces = token.start - functionNode.returnType.start - 1;
if (always && spaces > 1) {
context.report({
fix: _utilities.spacingFixers.stripSpacesAfter(colon, spaces - 1),
message: 'There must be 1 space after return type colon.',
node: functionNode
});
} else if (always && spaces === 0) {
context.report({
fix: _utilities.spacingFixers.addSpaceAfter(colon),
message: 'There must be a space after return type colon.',
node: functionNode
});
} else if (!always && spaces > 0) {
context.report({
fix: _utilities.spacingFixers.stripSpacesAfter(colon, spaces),
message: 'There must be no space after return type colon.',
node: functionNode
});
}
}
};
};
var functionEvaluators = (0, _utilities.iterateFunctionNodes)(function (context) {
var checkParam = propertyEvaluator(context, 'parameter');
var checkReturnType = returnTypeEvaluator(context);
return function (functionNode) {
_lodash2.default.forEach(functionNode.params, checkParam);
checkReturnType(functionNode);
};
});
// 1) type X = { foo(): A; }
// 2) type X = { foo: () => A; }
// the above have identical ASTs (save for their ranges)
// case 1 doesn't have a type annotation colon and should be ignored
var isShortPropertyFunction = function isShortPropertyFunction(objectTypeProperty) {
return objectTypeProperty.value.type === 'FunctionTypeAnnotation' && objectTypeProperty.start === objectTypeProperty.value.start;
};
var objectTypePropertyEvaluator = function objectTypePropertyEvaluator(context) {
var _parseOptions3 = parseOptions(context);
var always = _parseOptions3.always;
var sourceCode = context.getSourceCode();
var getColon = function getColon(objectTypeProperty) {
if (objectTypeProperty.optional || objectTypeProperty.static) {
return sourceCode.getFirstToken(objectTypeProperty, 2);
} else {
return sourceCode.getFirstToken(objectTypeProperty, 1);
}
};
return function (objectTypeProperty) {
if (isShortPropertyFunction(objectTypeProperty)) {
return;
}
var colon = getColon(objectTypeProperty);
var typeAnnotation = sourceCode.getTokenAfter(colon);
var spaces = typeAnnotation.start - colon.end;
var data = {
name: (0, _utilities.quoteName)((0, _utilities.getParameterName)(objectTypeProperty, context))
};
if (always && spaces > 1) {
context.report({
data: data,
fix: _utilities.spacingFixers.stripSpacesAfter(colon, spaces - 1),
message: 'There must be 1 space after {{name}}type annotation colon.',
node: objectTypeProperty
});
} else if (always && spaces === 0) {
context.report({
data: data,
fix: _utilities.spacingFixers.addSpaceAfter(colon),
message: 'There must be a space after {{name}}type annotation colon.',
node: objectTypeProperty
});
} else if (!always && spaces > 0) {
context.report({
data: data,
fix: _utilities.spacingFixers.stripSpacesAfter(colon, spaces),
message: 'There must be no space after {{name}}type annotation colon.',
node: objectTypeProperty
});
}
};
};
exports.default = function (context) {
return _extends({}, functionEvaluators(context), {
ClassProperty: propertyEvaluator(context, 'class property'),
ObjectTypeProperty: objectTypePropertyEvaluator(context)
});
};
module.exports = exports['default'];