UNPKG

5.81 kBJavaScriptView Raw
1"use strict";
2var __extends = (this && this.__extends) || (function () {
3 var extendStatics = Object.setPrototypeOf ||
4 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5 function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6 return function (d, b) {
7 extendStatics(d, b);
8 function __() { this.constructor = d; }
9 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
10 };
11})();
12Object.defineProperty(exports, "__esModule", { value: true });
13var ts = require("typescript");
14var Lint = require("tslint");
15var tsutils_1 = require("tsutils");
16var UNSPECIFIED_BROWSER_VERSION = 'unspecified version';
17var JSDOC_BROWSERSPECIFIC = '@browserspecific';
18var COMMENT_BROWSERSPECIFIC = 'Browser Specific:';
19var FAILURE_BROWSER_STRING = 'Unsupported browser';
20var FAILURE_VERSION_STRING = 'Unsupported browser version';
21var Rule = (function (_super) {
22 __extends(Rule, _super);
23 function Rule() {
24 return _super !== null && _super.apply(this, arguments) || this;
25 }
26 Rule.prototype.apply = function (sourceFile) {
27 return this.applyWithWalker(new NoUnsupportedBrowserCodeRuleWalker(sourceFile, this.getOptions()));
28 };
29 Rule.metadata = {
30 ruleName: 'no-unsupported-browser-code',
31 type: 'maintainability',
32 description: 'Avoid writing browser-specific code for unsupported browser versions',
33 options: null,
34 optionsDescription: '',
35 typescriptOnly: true,
36 issueClass: 'Non-SDL',
37 issueType: 'Warning',
38 severity: 'Low',
39 level: 'Opportunity for Excellence',
40 group: 'Clarity'
41 };
42 return Rule;
43}(Lint.Rules.AbstractRule));
44exports.Rule = Rule;
45var NoUnsupportedBrowserCodeRuleWalker = (function (_super) {
46 __extends(NoUnsupportedBrowserCodeRuleWalker, _super);
47 function NoUnsupportedBrowserCodeRuleWalker(sourceFile, options) {
48 var _this = _super.call(this, sourceFile, options) || this;
49 _this.supportedBrowsers = _this.parseSupportedBrowsers();
50 return _this;
51 }
52 NoUnsupportedBrowserCodeRuleWalker.prototype.visitSourceFile = function (node) {
53 var _this = this;
54 tsutils_1.forEachTokenWithTrivia(node, function (text, tokenSyntaxKind, range) {
55 var regex;
56 if (tokenSyntaxKind === ts.SyntaxKind.MultiLineCommentTrivia) {
57 regex = new RegExp(JSDOC_BROWSERSPECIFIC + "\\s*(.*)", 'gi');
58 }
59 else if (tokenSyntaxKind === ts.SyntaxKind.SingleLineCommentTrivia) {
60 regex = new RegExp(COMMENT_BROWSERSPECIFIC + "\\s*(.*)", 'gi');
61 }
62 else {
63 return;
64 }
65 var match;
66 var tokenText = text.substring(range.pos, range.end);
67 while ((match = regex.exec(tokenText))) {
68 var browser = _this.parseBrowserString(match[1]);
69 _this.findUnsupportedBrowserFailures(browser, range.pos, range.end - range.pos);
70 }
71 });
72 };
73 NoUnsupportedBrowserCodeRuleWalker.prototype.parseBrowserString = function (browser) {
74 var regex = /([a-zA-Z ]*)(>=|<=|<|>)?\s*(\d*)/i;
75 var match = browser.match(regex);
76 return {
77 name: match[1].trim(),
78 comparison: match[2] || '=',
79 version: parseInt(match[3], 10) || UNSPECIFIED_BROWSER_VERSION
80 };
81 };
82 NoUnsupportedBrowserCodeRuleWalker.prototype.parseSupportedBrowsers = function () {
83 var _this = this;
84 var result = {};
85 this.getOptions().forEach(function (option) {
86 if (option instanceof Array) {
87 option.forEach(function (browserString) {
88 var browser = _this.parseBrowserString(browserString);
89 result[browser.name.toLowerCase()] = browser;
90 });
91 }
92 });
93 return result;
94 };
95 NoUnsupportedBrowserCodeRuleWalker.prototype.isSupportedBrowser = function (targetBrowser) {
96 return targetBrowser.name.toLowerCase() in this.supportedBrowsers;
97 };
98 NoUnsupportedBrowserCodeRuleWalker.prototype.isSupportedBrowserVersion = function (targetBrowser) {
99 var supportedBrowser = this.supportedBrowsers[targetBrowser.name.toLowerCase()];
100 if (supportedBrowser.version === UNSPECIFIED_BROWSER_VERSION) {
101 return true;
102 }
103 switch (supportedBrowser.comparison) {
104 case '>':
105 return targetBrowser.version > supportedBrowser.version;
106 case '>=':
107 return targetBrowser.version >= supportedBrowser.version;
108 case '<':
109 return targetBrowser.version < supportedBrowser.version;
110 case '<=':
111 return targetBrowser.version <= supportedBrowser.version;
112 case '=':
113 return targetBrowser.version === supportedBrowser.version;
114 default:
115 return false;
116 }
117 };
118 NoUnsupportedBrowserCodeRuleWalker.prototype.findUnsupportedBrowserFailures = function (targetBrowser, startPos, length) {
119 if (!this.isSupportedBrowser(targetBrowser)) {
120 this.addFailureAt(startPos, length, FAILURE_BROWSER_STRING + ": " + targetBrowser.name);
121 }
122 else if (!this.isSupportedBrowserVersion(targetBrowser)) {
123 this.addFailureAt(startPos, length, FAILURE_VERSION_STRING + ": " + targetBrowser.name + " " + targetBrowser.version);
124 }
125 };
126 return NoUnsupportedBrowserCodeRuleWalker;
127}(Lint.RuleWalker));
128//# sourceMappingURL=noUnsupportedBrowserCodeRule.js.map
\No newline at end of file