lit-analyzer
Version:
CLI that type checks bindings in lit-html templates
41 lines (40 loc) • 2.31 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var ts_simple_type_1 = require("ts-simple-type");
var html_node_attr_assignment_types_js_1 = require("../analyze/types/html-node/html-node-attr-assignment-types.js");
var html_node_attr_types_js_1 = require("../analyze/types/html-node/html-node-attr-types.js");
var range_util_js_1 = require("../analyze/util/range-util.js");
var extract_binding_types_js_1 = require("./util/type/extract-binding-types.js");
/**
* This rule validates that "null" and "undefined" types are not bound in an attribute binding.
*/
var rule = {
id: "no-nullable-attribute-binding",
meta: {
priority: "high"
},
visitHtmlAssignment: function (assignment, context) {
// Only validate "expression" kind bindings.
if (assignment.kind !== html_node_attr_assignment_types_js_1.HtmlNodeAttrAssignmentKind.EXPRESSION)
return;
// Only validate "attribute" bindings because these will coerce null|undefined to a string.
var htmlAttr = assignment.htmlAttr;
if (htmlAttr.kind !== html_node_attr_types_js_1.HtmlNodeAttrKind.ATTRIBUTE)
return;
var typeB = (0, extract_binding_types_js_1.extractBindingTypes)(assignment, context).typeB;
var isAssignableToNull = (0, ts_simple_type_1.isAssignableToSimpleTypeKind)(typeB, "NULL");
// Test if removing "undefined" or "null" from typeB would work and suggest using "ifDefined".
if (isAssignableToNull || (0, ts_simple_type_1.isAssignableToSimpleTypeKind)(typeB, "UNDEFINED")) {
context.report({
location: (0, range_util_js_1.rangeFromHtmlNodeAttr)(htmlAttr),
message: "This attribute binds the type '".concat((0, ts_simple_type_1.typeToString)(typeB), "' which can end up binding the string '").concat(isAssignableToNull ? "null" : "undefined", "'."),
fixMessage: "Use the 'ifDefined' directive?",
fix: function () { return ({
message: "Use the 'ifDefined' directive.",
actions: [{ kind: "changeAssignment", assignment: assignment, newValue: "ifDefined(".concat(assignment.expression.getText(), ")") }]
}); }
});
}
}
};
exports.default = rule;
;