tslint-immutable
Version:
TSLint rules to disable mutation in TypeScript.
70 lines • 3.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var ts = require("typescript");
var check_node_1 = require("./shared/check-node");
var Ignore = require("./shared/ignore");
// tslint:disable-next-line:variable-name
exports.Rule = check_node_1.createCheckNodeRule(checkNode, "Modifying properties of existing object not allowed.");
var objPropAccessors = [
ts.SyntaxKind.ElementAccessExpression,
ts.SyntaxKind.PropertyAccessExpression
];
var forbidObjPropOnLeftSideOf = [
ts.SyntaxKind.EqualsToken,
ts.SyntaxKind.PlusEqualsToken,
ts.SyntaxKind.MinusEqualsToken,
ts.SyntaxKind.AsteriskEqualsToken,
ts.SyntaxKind.AsteriskAsteriskEqualsToken,
ts.SyntaxKind.SlashEqualsToken,
ts.SyntaxKind.PercentEqualsToken,
ts.SyntaxKind.LessThanLessThanEqualsToken,
ts.SyntaxKind.GreaterThanGreaterThanEqualsToken,
ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken,
ts.SyntaxKind.AmpersandEqualsToken,
ts.SyntaxKind.BarEqualsToken,
ts.SyntaxKind.CaretEqualsToken
];
var forbidUnaryOps = [
ts.SyntaxKind.PlusPlusToken,
ts.SyntaxKind.MinusMinusToken
];
function checkNode(node, ctx) {
var invalidNodes = [];
// No assignment with object.property on the left
if (node && node.kind === ts.SyntaxKind.BinaryExpression) {
var binExp_1 = node;
if (objPropAccessors.some(function (k) { return k === binExp_1.left.kind; }) &&
forbidObjPropOnLeftSideOf.some(function (k) { return k === binExp_1.operatorToken.kind; }) &&
!Ignore.isIgnoredPrefix(binExp_1.getText(node.getSourceFile()), ctx.options.ignorePrefix)) {
invalidNodes = invalidNodes.concat([check_node_1.createInvalidNode(node)]);
}
}
// No deleting object properties
if (node && node.kind === ts.SyntaxKind.DeleteExpression) {
var delExp_1 = node;
if (objPropAccessors.some(function (k) { return k === delExp_1.expression.kind; }) &&
!Ignore.isIgnoredPrefix(delExp_1.expression.getText(node.getSourceFile()), ctx.options.ignorePrefix)) {
invalidNodes = invalidNodes.concat([check_node_1.createInvalidNode(node)]);
}
}
// No prefix inc/dec
if (node && node.kind === ts.SyntaxKind.PrefixUnaryExpression) {
var preExp_1 = node;
if (objPropAccessors.some(function (k) { return k === preExp_1.operand.kind; }) &&
forbidUnaryOps.some(function (o) { return o === preExp_1.operator; }) &&
!Ignore.isIgnoredPrefix(preExp_1.operand.getText(node.getSourceFile()), ctx.options.ignorePrefix)) {
invalidNodes = invalidNodes.concat([check_node_1.createInvalidNode(node)]);
}
}
// No postfix inc/dec
if (node && node.kind === ts.SyntaxKind.PostfixUnaryExpression) {
var postExp_1 = node;
if (objPropAccessors.some(function (k) { return k === postExp_1.operand.kind; }) &&
forbidUnaryOps.some(function (o) { return o === postExp_1.operator; }) &&
!Ignore.isIgnoredPrefix(postExp_1.getText(node.getSourceFile()), ctx.options.ignorePrefix)) {
invalidNodes = invalidNodes.concat([check_node_1.createInvalidNode(node)]);
}
}
return { invalidNodes: invalidNodes };
}
//# sourceMappingURL=noObjectMutationRule.js.map