selectorPropertyBase.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. "use strict";
  2. var __extends = (this && this.__extends) || (function () {
  3. var extendStatics = function (d, b) {
  4. extendStatics = Object.setPrototypeOf ||
  5. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  6. function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
  7. return extendStatics(d, b);
  8. };
  9. return function (d, b) {
  10. extendStatics(d, b);
  11. function __() { this.constructor = d; }
  12. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13. };
  14. })();
  15. var _a;
  16. Object.defineProperty(exports, "__esModule", { value: true });
  17. var compiler_1 = require("@angular/compiler");
  18. var rules_1 = require("tslint/lib/rules");
  19. var utils_1 = require("tslint/lib/utils");
  20. var typescript_1 = require("typescript");
  21. var selectorValidator_1 = require("./util/selectorValidator");
  22. var utils_2 = require("./util/utils");
  23. exports.OPTION_STYLE_CAMEL_CASE = 'camelCase';
  24. exports.OPTION_STYLE_KEBAB_CASE = 'kebab-case';
  25. exports.OPTION_TYPE_ATTRIBUTE = 'attribute';
  26. exports.OPTION_TYPE_ATTRS = 'attrs';
  27. exports.OPTION_TYPE_ELEMENT = 'element';
  28. var SELECTOR_TYPE_MAPPER = (_a = {},
  29. _a[exports.OPTION_TYPE_ATTRIBUTE] = exports.OPTION_TYPE_ATTRS,
  30. _a[exports.OPTION_TYPE_ELEMENT] = exports.OPTION_TYPE_ELEMENT,
  31. _a);
  32. var SelectorPropertyBase = (function (_super) {
  33. __extends(SelectorPropertyBase, _super);
  34. function SelectorPropertyBase(options) {
  35. var _this = _super.call(this, options) || this;
  36. var ruleArguments = _this.getOptions().ruleArguments;
  37. _this.internalTypes = utils_1.arrayify(ruleArguments[0]);
  38. _this.prefixes = utils_1.arrayify(ruleArguments[1]);
  39. _this.style = ruleArguments[2];
  40. _this.types = utils_1.arrayify(ruleArguments[0] || [exports.OPTION_TYPE_ATTRIBUTE, exports.OPTION_TYPE_ELEMENT]).reduce(function (previousValue, currentValue) { return previousValue.concat(SELECTOR_TYPE_MAPPER[currentValue]); }, []);
  41. return _this;
  42. }
  43. SelectorPropertyBase.prototype.getValidSelectors = function (selectors) {
  44. var _this = this;
  45. return selectors.reduce(function (previousValue, currentValue) {
  46. var validSelectors = _this.types.reduce(function (accumulator, type) {
  47. var value = currentValue[type];
  48. return value ? accumulator.concat(value) : accumulator;
  49. }, []);
  50. return previousValue.concat(validSelectors);
  51. }, []);
  52. };
  53. SelectorPropertyBase.prototype.validatePrefixes = function (selectors) {
  54. var _this = this;
  55. return selectors.some(function (selector) { return _this.prefixes.some(function (prefix) { return selectorValidator_1.SelectorValidator.prefix(prefix, _this.style)(selector); }); });
  56. };
  57. SelectorPropertyBase.prototype.validateStyle = function (selectors) {
  58. var validator = this.style === exports.OPTION_STYLE_KEBAB_CASE ? selectorValidator_1.SelectorValidator.kebabCase : selectorValidator_1.SelectorValidator.camelCase;
  59. return selectors.some(function (selector) { return validator(selector); });
  60. };
  61. SelectorPropertyBase.prototype.validateTypes = function (selectors) {
  62. return selectors.length > 0;
  63. };
  64. SelectorPropertyBase.prototype.apply = function (sourceFile) {
  65. return this.applyWithFunction(sourceFile, walk, this);
  66. };
  67. return SelectorPropertyBase;
  68. }(rules_1.AbstractRule));
  69. exports.SelectorPropertyBase = SelectorPropertyBase;
  70. var validateClassDeclaration = function (context, node) {
  71. return typescript_1.createNodeArray(node.decorators).forEach(function (decorator) { return validateDecorator(context, decorator); });
  72. };
  73. var validateDecorator = function (context, decorator) {
  74. var selectorExpression = utils_2.getDecoratorPropertyInitializer(decorator, 'selector');
  75. var decoratorName = utils_2.getDecoratorName(decorator);
  76. if (!selectorExpression || !utils_2.isStringLiteralLike(selectorExpression) || context.options.handleType !== decoratorName) {
  77. return;
  78. }
  79. validateSelector(context, selectorExpression);
  80. };
  81. var validateSelector = function (context, expression) {
  82. var options = context.options;
  83. var selectors = compiler_1.CssSelector.parse(expression.text);
  84. var validSelectors = options.getValidSelectors(selectors);
  85. var failure;
  86. if (!options.validateTypes(validSelectors)) {
  87. failure = options.getTypeFailure(options.internalTypes);
  88. }
  89. else if (!options.validateStyle(validSelectors)) {
  90. failure = options.getStyleFailure(options.style);
  91. }
  92. else if (!options.validatePrefixes(validSelectors)) {
  93. failure = options.getPrefixFailure(options.prefixes);
  94. }
  95. if (failure) {
  96. context.addFailureAtNode(expression, failure);
  97. }
  98. };
  99. var walk = function (context) {
  100. var sourceFile = context.sourceFile;
  101. var callback = function (node) {
  102. if (typescript_1.isClassDeclaration(node))
  103. validateClassDeclaration(context, node);
  104. typescript_1.forEachChild(node, callback);
  105. };
  106. typescript_1.forEachChild(sourceFile, callback);
  107. };