├── .gitignore ├── .npmignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── LICENSE ├── README.md ├── build.sh ├── package.json ├── rules ├── conditionalExpressionParensRule.js ├── conditionalExpressionParensRule.ts ├── extVariableNameRule.js ├── extVariableNameRule.ts ├── index.js ├── index.ts ├── literalSpacingRule.js ├── literalSpacingRule.ts ├── maxParamsRule.js ├── maxParamsRule.ts ├── multilineArrowRule.js ├── multilineArrowRule.ts ├── preferCaseBlocksRule.js ├── preferCaseBlocksRule.ts ├── preferLiteralRule.js └── preferLiteralRule.ts ├── run_tests.sh ├── test └── rules │ ├── conditional-expression-parens │ └── default │ │ ├── test.ts.lint │ │ └── tslint.json │ ├── ext-variable-name │ └── default │ │ ├── test.ts.lint │ │ └── tslint.json │ ├── literal-spacing │ ├── always │ │ ├── test.ts.lint │ │ └── tslint.json │ ├── imports │ │ ├── test.ts.lint │ │ └── tslint.json │ └── never │ │ ├── test.ts.lint │ │ └── tslint.json │ ├── max-params │ └── default │ │ ├── test.ts.lint │ │ └── tslint.json │ ├── multiline-arrow │ └── default │ │ ├── test.ts.lint │ │ └── tslint.json │ ├── prefer-case-blocks │ └── default │ │ ├── test.ts.lint │ │ └── tslint.json │ └── prefer-literal │ └── default │ ├── test.ts.lint │ └── tslint.json ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | node_modules 3 | .gitignore 4 | build.sh 5 | run_tests.sh 6 | tsconfig.json 7 | 8 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Launch", 6 | "type": "node", 7 | "request": "launch", 8 | "program": "${workspaceRoot}/node_modules/.bin/tslint", 9 | "stopOnEntry": false, 10 | "args": ["--test", "test/rules/literal-spacing/never"], 11 | "cwd": "${workspaceRoot}", 12 | "preLaunchTask": "build", 13 | "runtimeExecutable": null, 14 | "runtimeArgs": [ 15 | "--nolazy" 16 | ], 17 | "env": { 18 | "NODE_ENV": "development" 19 | }, 20 | "externalConsole": false, 21 | "sourceMaps": true, 22 | "outDir": null 23 | }, 24 | { 25 | "name": "Attach", 26 | "type": "node", 27 | "request": "attach", 28 | "port": 5858, 29 | "address": "localhost", 30 | "restart": false, 31 | "sourceMaps": false, 32 | "outDir": null, 33 | "localRoot": "${workspaceRoot}", 34 | "remoteRoot": null 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "**/*.js": { "when": "$(basename).ts"}, 5 | "**/.git": true, 6 | "**/.DS_Store": true 7 | } 8 | , 9 | "typescript.tsdk": "./node_modules/typescript/lib" 10 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "0.1.0", 5 | "isShellCommand": true, 6 | "command": "npm", 7 | "showOutput": "always", 8 | "problemMatcher": "$tsc", 9 | "suppressTaskName": true, 10 | "tasks": [ 11 | { 12 | "taskName": "build", 13 | "isBuildCommand": true, 14 | "args": ["run", "build"], 15 | "problemMatcher": "$tsc" 16 | }, 17 | { 18 | "taskName": "test", 19 | "args": ["run", "test"], 20 | "isTestCommand": true 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 VR Source 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Purpose 2 | 3 | This project includes a variety of tslint rules we have found useful for our projects. 4 | 5 | # Usage 6 | 7 | Install from npm to your devDependencies (https://www.npmjs.com/package/vrsource-tslint-rules) 8 | 9 | ``` 10 | npm install --save-dev vrsource-tslint-rules 11 | ``` 12 | 13 | Configure tslint to use the vrsource-tslint-rules folder: 14 | 15 | Add `"vrsource-tslint-rules"` to the `extends` array of your `tslint.json` file: 16 | 17 | ``` 18 | { 19 | "rulesDirectory": ["vrsource-tslint-rules/rules"] 20 | "rules": { 21 | ... 22 | } 23 | } 24 | ``` 25 | 26 | Now configure some of the new rules. 27 | 28 | # Rules 29 | 30 | ## conditional-expression-parens 31 | 32 | Rule to enforce the use of parentheses each clause of a conditional when they 33 | are not simple expressions of a single indentifier or calling expression. 34 | 35 | ```javascript 36 | "conditional-expression-parens": true 37 | ``` 38 | 39 | ## ext-variable-name 40 | 41 | This rule provides extensive support for customizing allowable variable names 42 | for a wide variety of variable tags. The rule is configured by setting up a 43 | list of sub-rules that specify the tags of variables to check and the checks 44 | to perform on the variable's name. The sub-rules are checked in order 45 | and the first one that matches the tags of variable being checked is the 46 | only one that is used. 47 | 48 | An example set of sub-rules for an example coding standard is shown below. 49 | 50 | ```json 51 | "ext-variable-name": [ 52 | true, 53 | ["class", "pascal"], 54 | ["interface", "pascal", {"regex": "^I.*$"}], 55 | ["parameter", "camel"], 56 | ["property", "static", "camel", {"regex": "^s.*$"}], 57 | ["property", "private", "camel", "require-leading-underscore"], 58 | ["property", "protected", "camel", "allow-leading-underscore"], 59 | ["variable", "local", "snake"], 60 | ["variable", "const", "upper"], 61 | ["variable", "camel", {"regex": "^g.*$"}], 62 | ["method", "private", "camel", "require-leading-underscore"], 63 | ["method", "protected", "camel", "allow-leading-underscore"], 64 | ["function", "camel"], 65 | ["default", "camel"] 66 | ] 67 | ``` 68 | 69 | Allowed tags for variables: 70 | * primary (choose one): 71 | * class, interface, parameter, property, 72 | method, function, variable 73 | * modifiers (choose zero or more): 74 | * local, const, static, public, protected, private 75 | 76 | note: If any tags is added to a sub-rule then **all** must match the variable. 77 | 78 | Checks allowed: 79 | * One of: 80 | * "camel": Require variables to use camelCaseVariables 81 | * "snake": Require variables to use snake_case_variables 82 | * "pascal": Require variables to use PascalCaseVariables 83 | * "upper": Require variables to use UPPER_CASE_VARIABLES 84 | * "allow-leading-underscore": permits the variable to have a leading underscore 85 | * "allow-trailing-underscore": permits the variable to have a trailing underscore 86 | * "require-leading-underscore": requires the variable to have a leading underscore 87 | * "require-trailing-underscore": requires the variable to have a trailing underscore 88 | * "ban-keywords": bans a list of language keywords from being used 89 | * {"regex": "^.*$"}: checks the variable name against the given regex 90 | 91 | ## literal-spacing 92 | 93 | Rule to enforce consistent spacing inside array and object literals. 94 | 95 | See: eslint: object-curly-spacing and array-bracket-spacing 96 | 97 | ```javascript 98 | "literal-spacing": [ 99 | true, 100 | { 101 | "array": ["always"], 102 | "object": ["never"], 103 | "import": ["always"] 104 | } 105 | ] 106 | ``` 107 | 108 | ## max-params 109 | 110 | Rule to enforce a maximum number of parameters for functions and methods. 111 | 112 | ```javascript 113 | "max-params": [ 114 | true, 115 | 3 116 | ] 117 | ``` 118 | 119 | ## multiline-arrow 120 | 121 | Rule to enforce various checks arrow functions that span multiple lines. 122 | 123 | ```javascript 124 | "multiline-arrow": [ 125 | true, 126 | "require-parens", 127 | "require-block" 128 | ] 129 | ``` 130 | 131 | ## prefer-case-blocks 132 | 133 | This rule checks to make sure that all case clauses use a block 134 | around the statements of the case. This helps to protect against 135 | issues with lexcical declarations that would become visible to the 136 | entire switch statement. 137 | 138 | To maintain consistency, the rule requires a block in all cases. 139 | 140 | ```javascript 141 | "prefer-case-blocks": true 142 | ``` 143 | 144 | ## prefer-literal 145 | 146 | Flags locations where code calls "new Object()", "new Array()", "new Function()"" 147 | 148 | ```javascript 149 | "prefer-literal": [ 150 | true, 151 | "object", 152 | "function", 153 | "array" 154 | ] 155 | ``` 156 | 157 | # Changelog 158 | * 6.0.0 159 | * Breaking change: older checks removed in 5.8.0 160 | did not get fully removed. Now they are. 161 | Note: 5.8.2 and 5.8.3 also suffer from this breaking change. 162 | * 5.8.3 163 | * Bump release 164 | * 5.8.2 165 | * move tslint and typescript to peerDependencies 166 | * improve method to use as rulesDirectory 167 | * 5.8.1 168 | * Fix bug in spacing rule 169 | * 5.8.0 170 | * Update to tslint 5.8.0 171 | * Remove dot-notation (use no-string-literal instead) 172 | * Remove no-jasmine-focus (use ban instead) 173 | * Remove no-param-reassign (use no-parameter-reassignment instead) 174 | * Remove no-duplicate-import (now in tslint) 175 | * 5.1.1 176 | * Move chokidar-cli to devDependencies 177 | * 5.1.0 178 | * Updated to work with tslint 5.1.0 179 | * Update package.json to include build and test scripts 180 | * Cleaned up the tslint and tsconfig options used 181 | * 4.0.1 182 | * Add "main" entry to package.json to allow importing 183 | * 4.0.0 184 | * Update versioning to track major version of tslint 185 | * Update to tslint 4.x and TS 2.x 186 | * Remove `prefer-const` rule as tslint now supports it 187 | * 0.15.0 188 | * ajaff: Refactor and extend ext-variable-name options 189 | * simplify RuleWalker visitor methods 190 | * add support for validating property accessors 191 | * improve failure messages 192 | * add require-leading/training-underscore options 193 | * validate parameter properties as properties 194 | * 0.14.1 195 | * Add import options to literal-spacing rule 196 | * 0.13.1 197 | * Fix bugs in ext-variable-name rule. 198 | * variables in constructors didn't get the 'local' tag 199 | * variables could end up with 'public' tag that were not 200 | properties or methods 201 | * 0.13.0 202 | * Add no-jasmine-focus rule. 203 | * 0.12.1 204 | * Fix bug in dot-notation where invalid identifiers were not allowed. 205 | * 0.12.0 206 | * Added literal-spacing rule 207 | * 0.11.0 208 | * Added no-param-reassign rule 209 | * 0.10.0 210 | * Added prefer-case-blocks rule 211 | * 0.9.0 212 | * Add dot-notation rule 213 | * 0.8.0 214 | * Add conditional-expression-parens rule 215 | * 0.7.0 216 | * Add prefer-literal rule 217 | * 0.6.0 218 | * Add max-params rule 219 | * 0.5.0 220 | * Add no-duplicate-imports 221 | * 0.4.0 222 | * Add multiline-arrow rule 223 | * 0.3.0 224 | * Add prefer-const rule 225 | * 0.2.0 226 | * Remove demonstration rule 227 | * 0.1.0 228 | * First version 229 | 230 | # Contributing 231 | 232 | Contributions are greatly appreciated. Please fork the repository and submit a pull request. 233 | 234 | ## Contributors 235 | 236 | * ajafff 237 | * abdulmoizeng 238 | * timocov 239 | * jayrylan 240 | * ethanresnick 241 | 242 | # Development 243 | 244 | ## Development steps 245 | 246 | The command `npm run test` will run tests locally. 247 | 248 | To add a new rule: 249 | - Add the rule's .ts file to the /rules directory 250 | - Add one or more tests in the test/rules directory 251 | - Use run_tests.sh to build and run the tests 252 | - (optional) The .vscode directory includes settings to run and debug rules in vscode. 253 | - Just modify the "args" entry to point to the rule test case to run 254 | 255 | Notes for how to build new rules and tests: 256 | 257 | - http://palantir.github.io/tslint/develop/custom-rules/ 258 | - https://github.com/palantir/tslint/blob/master/src/language/walker/syntaxWalker.ts 259 | - http://palantir.github.io/tslint/develop/testing-rules/ 260 | 261 | ## Resources 262 | 263 | * AST explorer: https://astexplorer.net/ 264 | * Typescript Compiler API: https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API 265 | * AST Dive: https://basarat.gitbooks.io/typescript/content/docs/compiler/ast.html 266 | 267 | ## Example Rules 268 | 269 | * Typescript project rules: https://github.com/Microsoft/TypeScript/pull/4458 270 | * https://github.com/mgechev/codelyzer 271 | * https://github.com/Microsoft/tslint-microsoft-contrib 272 | * https://github.com/buzinas/tslint-eslint-rules 273 | 274 | ## Release Process 275 | 276 | * Update version in package.json 277 | * Update Changelog 278 | * git commit 279 | * git tag -a vX.Y.Z -m "Tag Release" 280 | * git push --tags 281 | * npm publish 282 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -v 3 | 4 | # Compile all rules 5 | ./node_modules/.bin/tsc -p . 6 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vrsource-tslint-rules", 3 | "version": "6.0.0", 4 | "description": "Extension rules for tslint", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/vrsource/vrsource-tslint-rules" 8 | }, 9 | "main": "tslint.json", 10 | "keywords": [ 11 | "eslint", 12 | "tslint", 13 | "custom-rules", 14 | "rules", 15 | "stylish", 16 | "lint", 17 | "linting", 18 | "linter", 19 | "tslint-plugin" 20 | ], 21 | "license": "MIT", 22 | "peerDependencies": { 23 | "tslint": "*", 24 | "typescript": "*" 25 | }, 26 | "devDependencies": { 27 | "@types/node": "^10.0.0", 28 | "chokidar-cli": "~1.2.0", 29 | "tslint": "~5.8.0", 30 | "typescript": "~2.5.3" 31 | }, 32 | "watch": { 33 | "test": "rules/*.ts" 34 | }, 35 | "scripts": { 36 | "build": "tsc -p .", 37 | "lint": "tslint rules/*.ts --project .", 38 | "test:once": "./run_tests.sh", 39 | "test": "npm run lint && npm run build && npm run test:once", 40 | "watch": "chokidar 'rules/*.ts' 'test/**/*' -c 'npm run test'" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /rules/conditionalExpressionParensRule.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __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 | })(); 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | var Lint = require("tslint"); 14 | var ts = require("typescript"); 15 | var FAIL_STR = "Expression clause must be parenthesized"; 16 | var allowedClauseKinds = [ 17 | ts.SyntaxKind.ParenthesizedExpression, ts.SyntaxKind.CallExpression, 18 | ts.SyntaxKind.Identifier, ts.SyntaxKind.StringLiteral, ts.SyntaxKind.NumericLiteral, 19 | ts.SyntaxKind.RegularExpressionLiteral, ts.SyntaxKind.TypeLiteral, 20 | ts.SyntaxKind.StringLiteral, ts.SyntaxKind.ArrayLiteralExpression, 21 | ts.SyntaxKind.ObjectLiteralExpression, 22 | ]; 23 | var PreferLiteralWalker = (function (_super) { 24 | __extends(PreferLiteralWalker, _super); 25 | function PreferLiteralWalker() { 26 | return _super !== null && _super.apply(this, arguments) || this; 27 | } 28 | PreferLiteralWalker.prototype.visitConditionalExpression = function (node) { 29 | var _this = this; 30 | var clauses = [node.condition, node.whenFalse, node.whenTrue]; 31 | clauses.forEach(function (clause) { 32 | if (allowedClauseKinds.indexOf(clause.kind) === -1) { 33 | _this.addFailure(_this.createFailure(clause.getStart(), clause.getWidth(), FAIL_STR)); 34 | } 35 | }); 36 | this.walkChildren(node); 37 | }; 38 | return PreferLiteralWalker; 39 | }(Lint.RuleWalker)); 40 | var Rule = (function (_super) { 41 | __extends(Rule, _super); 42 | function Rule() { 43 | return _super !== null && _super.apply(this, arguments) || this; 44 | } 45 | Rule.prototype.apply = function (sourceFile) { 46 | return this.applyWithWalker(new PreferLiteralWalker(sourceFile, this.getOptions())); 47 | }; 48 | return Rule; 49 | }(Lint.Rules.AbstractRule)); 50 | exports.Rule = Rule; 51 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uYWxFeHByZXNzaW9uUGFyZW5zUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbmRpdGlvbmFsRXhwcmVzc2lvblBhcmVuc1J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBWUEsNkJBQStCO0FBQy9CLCtCQUFpQztBQUVqQyxJQUFNLFFBQVEsR0FBRyx5Q0FBeUMsQ0FBQztBQUUzRCxJQUFNLGtCQUFrQixHQUFHO0lBQ3ZCLEVBQUUsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjO0lBQ25FLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYztJQUNuRixFQUFFLENBQUMsVUFBVSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVztJQUNqRSxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLHNCQUFzQjtJQUNqRSxFQUFFLENBQUMsVUFBVSxDQUFDLHVCQUF1QjtDQUN4QyxDQUFDO0FBRUY7SUFBa0MsdUNBQWU7SUFBakQ7O0lBWUEsQ0FBQztJQVhhLHdEQUEwQixHQUFwQyxVQUFxQyxJQUE4QjtRQUFuRSxpQkFVQztRQVRHLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQUMsTUFBTTtZQUNuQixFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN4RixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDTCwwQkFBQztBQUFELENBQUMsQUFaRCxDQUFrQyxJQUFJLENBQUMsVUFBVSxHQVloRDtBQUVEO0lBQTBCLHdCQUF1QjtJQUFqRDs7SUFJQSxDQUFDO0lBSFUsb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNMLFdBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBSWhEO0FBSlksb0JBQUkifQ== -------------------------------------------------------------------------------- /rules/conditionalExpressionParensRule.ts: -------------------------------------------------------------------------------- 1 | /* KEEP IN SYNC with README.md 2 | 3 | ## conditional-expression-parens 4 | 5 | Rule to enforce the use of parentheses each clause of a conditional when they 6 | are not simple expressions of a single indentifier or calling expression. 7 | 8 | ```javascript 9 | "conditional-expression-parens": true 10 | ``` 11 | */ 12 | 13 | import * as Lint from "tslint"; 14 | import * as ts from "typescript"; 15 | 16 | const FAIL_STR = "Expression clause must be parenthesized"; 17 | 18 | const allowedClauseKinds = [ 19 | ts.SyntaxKind.ParenthesizedExpression, ts.SyntaxKind.CallExpression, 20 | ts.SyntaxKind.Identifier, ts.SyntaxKind.StringLiteral, ts.SyntaxKind.NumericLiteral, 21 | ts.SyntaxKind.RegularExpressionLiteral, ts.SyntaxKind.TypeLiteral, 22 | ts.SyntaxKind.StringLiteral, ts.SyntaxKind.ArrayLiteralExpression, 23 | ts.SyntaxKind.ObjectLiteralExpression, 24 | ]; 25 | 26 | class PreferLiteralWalker extends Lint.RuleWalker { 27 | protected visitConditionalExpression(node: ts.ConditionalExpression) { 28 | let clauses = [node.condition, node.whenFalse, node.whenTrue]; 29 | 30 | clauses.forEach((clause) => { 31 | if (allowedClauseKinds.indexOf(clause.kind) === -1) { 32 | this.addFailure(this.createFailure(clause.getStart(), clause.getWidth(), FAIL_STR)); 33 | } 34 | }); 35 | 36 | this.walkChildren(node); 37 | } 38 | } 39 | 40 | export class Rule extends Lint.Rules.AbstractRule { 41 | public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { 42 | return this.applyWithWalker(new PreferLiteralWalker(sourceFile, this.getOptions())); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /rules/extVariableNameRule.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __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 | })(); 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | var ts = require("typescript"); 14 | var Lint = require("tslint"); 15 | var CLASS_TAG = "class"; 16 | var INTERFACE_TAG = "interface"; 17 | var PARAMETER_TAG = "parameter"; 18 | var PROPERTY_TAG = "property"; 19 | var METHOD_TAG = "method"; 20 | var FUNCTION_TAG = "function"; 21 | var VARIABLE_TAG = "variable"; 22 | var LOCAL_TAG = "local"; 23 | var STATIC_TAG = "static"; 24 | var CONST_TAG = "const"; 25 | var PUBLIC_TAG = "public"; 26 | var PROTECTED_TAG = "protected"; 27 | var PRIVATE_TAG = "private"; 28 | var VALID_VAR_TAGS = [CLASS_TAG, INTERFACE_TAG, PARAMETER_TAG, 29 | PROPERTY_TAG, METHOD_TAG, FUNCTION_TAG, VARIABLE_TAG, 30 | LOCAL_TAG, STATIC_TAG, CONST_TAG, 31 | PUBLIC_TAG, PROTECTED_TAG, PRIVATE_TAG]; 32 | var PASCAL_OPTION = "pascal"; 33 | var CAMEL_OPTION = "camel"; 34 | var SNAKE_OPTION = "snake"; 35 | var UPPER_OPTION = "upper"; 36 | var ALLOW_LEADING_UNDERSCORE_OPTION = "allow-leading-underscore"; 37 | var ALLOW_TRAILING_UNDERSCORE_OPTION = "allow-trailing-underscore"; 38 | var REQUIRE_LEADING_UNDERSCORE_OPTION = "require-leading-underscore"; 39 | var REQUIRE_TRAILING_UNDERSCORE_OPTION = "require-trailing-underscore"; 40 | var BAN_KEYWORDS_OPTION = "ban-keywords"; 41 | var CAMEL_FAIL = "must be in camel case"; 42 | var PASCAL_FAIL = "must be in pascal case"; 43 | var SNAKE_FAIL = "must be in snake case"; 44 | var UPPER_FAIL = "must be in uppercase"; 45 | var KEYWORD_FAIL = "name clashes with keyword/type"; 46 | var LEADING_FAIL = "name must not have leading underscore"; 47 | var TRAILING_FAIL = "name must not have trailing underscore"; 48 | var NO_LEADING_FAIL = "name must have leading underscore"; 49 | var NO_TRAILING_FAIL = "name must have trailing underscore"; 50 | var REGEX_FAIL = "name did not match required regex"; 51 | var BANNED_KEYWORDS = ["any", "Number", "number", "String", "string", 52 | "Boolean", "boolean", "Undefined", "undefined"]; 53 | var VariableChecker = (function () { 54 | function VariableChecker(opts) { 55 | var _this = this; 56 | this.caseCheck = ""; 57 | this.allowLeadingUnderscore = false; 58 | this.allowTrailingUnderscore = false; 59 | this.requireLeadingUnderscore = false; 60 | this.requireTrailingUnderscore = false; 61 | this.banKeywords = false; 62 | this.regex = null; 63 | this.varTags = opts.filter(function (v) { return contains(VALID_VAR_TAGS, v); }); 64 | if (contains(opts, PASCAL_OPTION)) { 65 | this.caseCheck = PASCAL_OPTION; 66 | } 67 | else if (contains(opts, CAMEL_OPTION)) { 68 | this.caseCheck = CAMEL_OPTION; 69 | } 70 | else if (contains(opts, SNAKE_OPTION)) { 71 | this.caseCheck = SNAKE_OPTION; 72 | } 73 | else if (contains(opts, UPPER_OPTION)) { 74 | this.caseCheck = UPPER_OPTION; 75 | } 76 | this.allowLeadingUnderscore = contains(opts, ALLOW_LEADING_UNDERSCORE_OPTION); 77 | this.allowTrailingUnderscore = contains(opts, ALLOW_TRAILING_UNDERSCORE_OPTION); 78 | this.requireLeadingUnderscore = contains(opts, REQUIRE_LEADING_UNDERSCORE_OPTION); 79 | this.requireTrailingUnderscore = contains(opts, REQUIRE_TRAILING_UNDERSCORE_OPTION); 80 | this.banKeywords = contains(opts, BAN_KEYWORDS_OPTION); 81 | opts.forEach(function (opt) { 82 | if (opt.regex !== undefined) { 83 | _this.regex = new RegExp(opt.regex); 84 | } 85 | }); 86 | } 87 | VariableChecker.prototype.requiredTagsFound = function (proposedTags) { 88 | var matches = true; 89 | this.varTags.forEach(function (tag) { 90 | if (!contains(proposedTags, tag)) { 91 | matches = false; 92 | } 93 | }); 94 | return matches; 95 | }; 96 | VariableChecker.prototype.failMessage = function (failMessage, tag) { 97 | return tag[0].toUpperCase() + tag.substr(1) + " " + failMessage; 98 | }; 99 | VariableChecker.prototype.checkName = function (name, walker, tag) { 100 | var variableName = name.text; 101 | var firstCharacter = variableName[0]; 102 | var lastCharacter = variableName[variableName.length - 1]; 103 | if ((this.regex !== null) && !variableName.match(this.regex)) { 104 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(REGEX_FAIL, tag))); 105 | } 106 | if (this.banKeywords && contains(BANNED_KEYWORDS, variableName)) { 107 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(KEYWORD_FAIL, tag))); 108 | } 109 | if ("_" === firstCharacter) { 110 | if (!this.allowLeadingUnderscore && !this.requireLeadingUnderscore) { 111 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(LEADING_FAIL, tag))); 112 | } 113 | variableName = variableName.slice(1); 114 | } 115 | else if (this.requireLeadingUnderscore) { 116 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(NO_LEADING_FAIL, tag))); 117 | } 118 | if (("_" === lastCharacter) && (variableName.length > 0)) { 119 | if (!this.allowTrailingUnderscore && !this.requireTrailingUnderscore) { 120 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(TRAILING_FAIL, tag))); 121 | } 122 | variableName = variableName.slice(0, -1); 123 | } 124 | else if (this.requireTrailingUnderscore) { 125 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(NO_TRAILING_FAIL, tag))); 126 | } 127 | if ((PASCAL_OPTION === this.caseCheck) && !isPascalCased(variableName)) { 128 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(PASCAL_FAIL, tag))); 129 | } 130 | else if ((CAMEL_OPTION === this.caseCheck) && !isCamelCase(variableName)) { 131 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(CAMEL_FAIL, tag))); 132 | } 133 | else if ((SNAKE_OPTION === this.caseCheck) && !isSnakeCase(variableName)) { 134 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(SNAKE_FAIL, tag))); 135 | } 136 | else if ((UPPER_OPTION === this.caseCheck) && !isUpperCase(variableName)) { 137 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), this.failMessage(UPPER_FAIL, tag))); 138 | } 139 | }; 140 | return VariableChecker; 141 | }()); 142 | var VariableNameWalker = (function (_super) { 143 | __extends(VariableNameWalker, _super); 144 | function VariableNameWalker(sourceFile, options) { 145 | var _this = _super.call(this, sourceFile, options) || this; 146 | _this.checkers = []; 147 | var sub_rules = options.ruleArguments; 148 | sub_rules.forEach(function (rule_opts) { 149 | _this.checkers.push(new VariableChecker(rule_opts)); 150 | }); 151 | return _this; 152 | } 153 | VariableNameWalker.prototype.visitClassDeclaration = function (node) { 154 | this.checkName(node, CLASS_TAG); 155 | _super.prototype.visitClassDeclaration.call(this, node); 156 | }; 157 | VariableNameWalker.prototype.visitMethodDeclaration = function (node) { 158 | this.checkName(node, METHOD_TAG); 159 | _super.prototype.visitMethodDeclaration.call(this, node); 160 | }; 161 | VariableNameWalker.prototype.visitInterfaceDeclaration = function (node) { 162 | this.checkName(node, INTERFACE_TAG); 163 | _super.prototype.visitInterfaceDeclaration.call(this, node); 164 | }; 165 | VariableNameWalker.prototype.visitBindingElement = function (node) { 166 | this.checkName(node, VARIABLE_TAG); 167 | _super.prototype.visitBindingElement.call(this, node); 168 | }; 169 | VariableNameWalker.prototype.visitParameterDeclaration = function (node) { 170 | var parameterProperty = Lint.hasModifier(node.modifiers, ts.SyntaxKind.PublicKeyword) || 171 | Lint.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword) || 172 | Lint.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword); 173 | this.checkName(node, parameterProperty ? PROPERTY_TAG : PARAMETER_TAG); 174 | _super.prototype.visitParameterDeclaration.call(this, node); 175 | }; 176 | VariableNameWalker.prototype.visitPropertyDeclaration = function (node) { 177 | this.checkName(node, PROPERTY_TAG); 178 | _super.prototype.visitPropertyDeclaration.call(this, node); 179 | }; 180 | VariableNameWalker.prototype.visitSetAccessor = function (node) { 181 | this.checkName(node, PROPERTY_TAG); 182 | _super.prototype.visitSetAccessor.call(this, node); 183 | }; 184 | VariableNameWalker.prototype.visitGetAccessor = function (node) { 185 | this.checkName(node, PROPERTY_TAG); 186 | _super.prototype.visitGetAccessor.call(this, node); 187 | }; 188 | VariableNameWalker.prototype.visitVariableDeclaration = function (node) { 189 | this.checkName(node, VARIABLE_TAG); 190 | _super.prototype.visitVariableDeclaration.call(this, node); 191 | }; 192 | VariableNameWalker.prototype.visitVariableStatement = function (node) { 193 | if (!Lint.hasModifier(node.modifiers, ts.SyntaxKind.DeclareKeyword)) { 194 | _super.prototype.visitVariableStatement.call(this, node); 195 | } 196 | }; 197 | VariableNameWalker.prototype.visitFunctionDeclaration = function (node) { 198 | this.checkName(node, FUNCTION_TAG); 199 | _super.prototype.visitFunctionDeclaration.call(this, node); 200 | }; 201 | VariableNameWalker.prototype.checkName = function (node, tag) { 202 | if (node.name && node.name.kind === ts.SyntaxKind.Identifier) { 203 | var matching_checker = this.getMatchingChecker(this.getNodeTags(node, tag)); 204 | if (matching_checker !== null) { 205 | matching_checker.checkName(node.name, this, tag); 206 | } 207 | } 208 | }; 209 | VariableNameWalker.prototype.getMatchingChecker = function (varTags) { 210 | var matching_checkers = this.checkers.filter(function (checker) { return checker.requiredTagsFound(varTags); }); 211 | if (matching_checkers.length > 0) { 212 | return matching_checkers[0]; 213 | } 214 | else { 215 | return null; 216 | } 217 | }; 218 | VariableNameWalker.prototype.getNodeTags = function (node, primaryTag) { 219 | var tags = [primaryTag]; 220 | if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.StaticKeyword)) { 221 | tags.push(STATIC_TAG); 222 | } 223 | if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.ConstKeyword)) { 224 | tags.push(CONST_TAG); 225 | } 226 | if (primaryTag === PROPERTY_TAG || primaryTag === METHOD_TAG) { 227 | if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword)) { 228 | tags.push(PRIVATE_TAG); 229 | } 230 | else if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword)) { 231 | tags.push(PROTECTED_TAG); 232 | } 233 | else { 234 | tags.push(PUBLIC_TAG); 235 | } 236 | } 237 | var nearest_body = nearestBody(node); 238 | if (!nearest_body.isSourceFile) { 239 | tags.push(LOCAL_TAG); 240 | } 241 | if (node.kind === ts.SyntaxKind.VariableDeclaration) { 242 | if (isConstVariable(node)) { 243 | tags.push(CONST_TAG); 244 | } 245 | } 246 | return tags; 247 | }; 248 | return VariableNameWalker; 249 | }(Lint.RuleWalker)); 250 | function nearestBody(node) { 251 | var VALID_PARENT_TYPES = [ 252 | ts.SyntaxKind.SourceFile, 253 | ts.SyntaxKind.FunctionDeclaration, 254 | ts.SyntaxKind.FunctionExpression, 255 | ts.SyntaxKind.ArrowFunction, 256 | ts.SyntaxKind.MethodDeclaration, 257 | ts.SyntaxKind.Constructor, 258 | ]; 259 | var ancestor = node.parent; 260 | while (ancestor && !contains(VALID_PARENT_TYPES, ancestor.kind)) { 261 | ancestor = ancestor.parent; 262 | } 263 | return { 264 | containingBody: ancestor, 265 | isSourceFile: (ancestor && ancestor.kind === ts.SyntaxKind.SourceFile) || !ancestor, 266 | }; 267 | } 268 | function isConstVariable(node) { 269 | var parentNode = (node.kind === ts.SyntaxKind.VariableDeclaration) 270 | ? node.parent 271 | : node.declarationList; 272 | return !parentNode || Lint.isNodeFlagSet(parentNode, ts.NodeFlags.Const); 273 | } 274 | function isPascalCased(name) { 275 | if (name.length <= 0) { 276 | return true; 277 | } 278 | var firstCharacter = name.charAt(0); 279 | return ((firstCharacter === firstCharacter.toUpperCase()) && name.indexOf("_") === -1); 280 | } 281 | function isCamelCase(name) { 282 | var firstCharacter = name.charAt(0); 283 | if (name.length <= 0) { 284 | return true; 285 | } 286 | if (!isLowerCase(firstCharacter)) { 287 | return false; 288 | } 289 | return name.indexOf("_") === -1; 290 | } 291 | function isSnakeCase(name) { 292 | return isLowerCase(name); 293 | } 294 | function isLowerCase(name) { 295 | return name === name.toLowerCase(); 296 | } 297 | function isUpperCase(name) { 298 | return name === name.toUpperCase(); 299 | } 300 | function contains(arr, value) { 301 | return arr.indexOf(value) !== -1; 302 | } 303 | var Rule = (function (_super) { 304 | __extends(Rule, _super); 305 | function Rule() { 306 | return _super !== null && _super.apply(this, arguments) || this; 307 | } 308 | Rule.prototype.apply = function (sourceFile) { 309 | var variableNameWalker = new VariableNameWalker(sourceFile, this.getOptions()); 310 | return this.applyWithWalker(variableNameWalker); 311 | }; 312 | return Rule; 313 | }(Lint.Rules.AbstractRule)); 314 | exports.Rule = Rule; 315 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0VmFyaWFibGVOYW1lUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4dFZhcmlhYmxlTmFtZVJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQWlDO0FBQ2pDLDZCQUErQjtBQTBEL0IsSUFBTSxTQUFTLEdBQU8sT0FBTyxDQUFDO0FBQzlCLElBQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQztBQUNsQyxJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsSUFBTSxZQUFZLEdBQUksVUFBVSxDQUFDO0FBQ2pDLElBQU0sVUFBVSxHQUFNLFFBQVEsQ0FBQztBQUMvQixJQUFNLFlBQVksR0FBSSxVQUFVLENBQUM7QUFDakMsSUFBTSxZQUFZLEdBQUksVUFBVSxDQUFDO0FBRWpDLElBQU0sU0FBUyxHQUFPLE9BQU8sQ0FBQztBQUM5QixJQUFNLFVBQVUsR0FBTSxRQUFRLENBQUM7QUFDL0IsSUFBTSxTQUFTLEdBQU8sT0FBTyxDQUFDO0FBQzlCLElBQU0sVUFBVSxHQUFNLFFBQVEsQ0FBQztBQUMvQixJQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsSUFBTSxXQUFXLEdBQUssU0FBUyxDQUFDO0FBRWhDLElBQU0sY0FBYyxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhO0lBQ3ZDLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVk7SUFDcEQsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTO0lBQ2hDLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFaEUsSUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBQy9CLElBQU0sWUFBWSxHQUFJLE9BQU8sQ0FBQztBQUM5QixJQUFNLFlBQVksR0FBSSxPQUFPLENBQUM7QUFDOUIsSUFBTSxZQUFZLEdBQUksT0FBTyxDQUFDO0FBQzlCLElBQU0sK0JBQStCLEdBQU0sMEJBQTBCLENBQUM7QUFDdEUsSUFBTSxnQ0FB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LEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFD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 -------------------------------------------------------------------------------- /rules/extVariableNameRule.ts: -------------------------------------------------------------------------------- 1 | import * as ts from "typescript"; 2 | import * as Lint from "tslint"; 3 | 4 | /** KEEP IN SYNC WITH README.md 5 | 6 | ## ext-variable-name 7 | 8 | This rule provides extensive support for customizing allowable variable names 9 | for a wide variety of variable tags. The rule is configured by setting up a 10 | list of sub-rules that specify the tags of variables to check and the checks 11 | to perform on the variable's name. The sub-rules are checked in order 12 | and the first one that matches the tags of variable being checked is the 13 | only one that is used. 14 | 15 | An example set of sub-rules for an example coding standard is shown below. 16 | 17 | ```json 18 | "ext-variable-name": [ 19 | true, 20 | ["class", "pascal"], 21 | ["interface", "pascal", {"regex": "^I.*$"}], 22 | ["parameter", "camel"], 23 | ["property", "static", "camel", {"regex": "^s.*$"}], 24 | ["property", "private", "camel", "allow-leading-underscore"], 25 | ["property", "protected", "camel", "allow-leading-underscore"], 26 | ["variable", "local", "snake"], 27 | ["variable", "const", "upper"], 28 | ["variable", "camel", {"regex": "^g.*$"}], 29 | ["method", "private", "camel", "allow-leading-underscore"], 30 | ["method", "protected", "camel", "allow-leading-underscore"], 31 | ["function", "camel"], 32 | ["default", "camel"] 33 | ] 34 | ``` 35 | 36 | Allowed tags for variables: 37 | * primary (choose one): 38 | * class, interface, parameter, property, 39 | method, function, variable 40 | * modifiers (choose zero or more): 41 | * local, const, static, public, protected, private 42 | 43 | note: If any tags is added to a sub-rule then **all** must match the variable. 44 | 45 | Checks allowed: 46 | * One of: 47 | * "camel": Require variables to use camelCaseVariables 48 | * "snake": Require variables to use snake_case_variables 49 | * "pascal": Require variables to use PascalCaseVariables 50 | * "upper": Require variables to use UPPER_CASE_VARIABLES 51 | * "allow-leading-underscore": permits the variable to have a leading underscore 52 | * "allow-trailing-underscore": permits the variable to have a trailing underscore 53 | * "require-leading-underscore": requires the variable to have a leading underscore 54 | * "require-trailing-underscore": requires the variable to have a trailing underscore 55 | * "ban-keywords": bans a list of language keywords from being used 56 | * {"regex": "^.*$"}: checks the variable name against the given regex 57 | 58 | */ 59 | 60 | const CLASS_TAG = "class"; 61 | const INTERFACE_TAG = "interface"; 62 | const PARAMETER_TAG = "parameter"; 63 | const PROPERTY_TAG = "property"; 64 | const METHOD_TAG = "method"; 65 | const FUNCTION_TAG = "function"; 66 | const VARIABLE_TAG = "variable"; 67 | 68 | const LOCAL_TAG = "local"; 69 | const STATIC_TAG = "static"; 70 | const CONST_TAG = "const"; 71 | const PUBLIC_TAG = "public"; 72 | const PROTECTED_TAG = "protected"; 73 | const PRIVATE_TAG = "private"; 74 | 75 | const VALID_VAR_TAGS = [CLASS_TAG, INTERFACE_TAG, PARAMETER_TAG, 76 | PROPERTY_TAG, METHOD_TAG, FUNCTION_TAG, VARIABLE_TAG, 77 | LOCAL_TAG, STATIC_TAG, CONST_TAG, 78 | PUBLIC_TAG, PROTECTED_TAG, PRIVATE_TAG]; 79 | 80 | const PASCAL_OPTION = "pascal"; 81 | const CAMEL_OPTION = "camel"; 82 | const SNAKE_OPTION = "snake"; 83 | const UPPER_OPTION = "upper"; 84 | const ALLOW_LEADING_UNDERSCORE_OPTION = "allow-leading-underscore"; 85 | const ALLOW_TRAILING_UNDERSCORE_OPTION = "allow-trailing-underscore"; 86 | const REQUIRE_LEADING_UNDERSCORE_OPTION = "require-leading-underscore"; 87 | const REQUIRE_TRAILING_UNDERSCORE_OPTION = "require-trailing-underscore"; 88 | const BAN_KEYWORDS_OPTION = "ban-keywords"; 89 | 90 | const CAMEL_FAIL = "must be in camel case"; 91 | const PASCAL_FAIL = "must be in pascal case"; 92 | const SNAKE_FAIL = "must be in snake case"; 93 | const UPPER_FAIL = "must be in uppercase"; 94 | const KEYWORD_FAIL = "name clashes with keyword/type"; 95 | const LEADING_FAIL = "name must not have leading underscore"; 96 | const TRAILING_FAIL = "name must not have trailing underscore"; 97 | const NO_LEADING_FAIL = "name must have leading underscore"; 98 | const NO_TRAILING_FAIL = "name must have trailing underscore"; 99 | const REGEX_FAIL = "name did not match required regex"; 100 | 101 | const BANNED_KEYWORDS = ["any", "Number", "number", "String", "string", 102 | "Boolean", "boolean", "Undefined", "undefined"]; 103 | 104 | 105 | /** 106 | * Configured with details needed to check a specific variable type. 107 | */ 108 | class VariableChecker { 109 | public varTags: string[]; 110 | 111 | public caseCheck: string = ""; 112 | public allowLeadingUnderscore: boolean = false; 113 | public allowTrailingUnderscore: boolean = false; 114 | public requireLeadingUnderscore: boolean = false; 115 | public requireTrailingUnderscore: boolean = false; 116 | public banKeywords: boolean = false; 117 | public regex: RegExp | null = null; 118 | 119 | constructor(opts: any[]) { 120 | this.varTags = opts.filter(v => contains(VALID_VAR_TAGS, v)); 121 | 122 | if (contains(opts, PASCAL_OPTION)) { 123 | this.caseCheck = PASCAL_OPTION; 124 | } else if (contains(opts, CAMEL_OPTION)) { 125 | this.caseCheck = CAMEL_OPTION; 126 | } else if (contains(opts, SNAKE_OPTION)) { 127 | this.caseCheck = SNAKE_OPTION; 128 | } else if (contains(opts, UPPER_OPTION)) { 129 | this.caseCheck = UPPER_OPTION; 130 | } 131 | 132 | this.allowLeadingUnderscore = contains(opts, ALLOW_LEADING_UNDERSCORE_OPTION); 133 | this.allowTrailingUnderscore = contains(opts, ALLOW_TRAILING_UNDERSCORE_OPTION); 134 | this.requireLeadingUnderscore = contains(opts, REQUIRE_LEADING_UNDERSCORE_OPTION); 135 | this.requireTrailingUnderscore = contains(opts, REQUIRE_TRAILING_UNDERSCORE_OPTION); 136 | this.banKeywords = contains(opts, BAN_KEYWORDS_OPTION); 137 | 138 | opts.forEach((opt) => { 139 | if (opt.regex !== undefined) { 140 | this.regex = new RegExp(opt.regex); 141 | } 142 | }); 143 | } 144 | 145 | /** 146 | * return true if all of our tags are all in the input tags 147 | * (ie. we match if we dont have a tag that prevents it) 148 | */ 149 | public requiredTagsFound(proposedTags: string[]) { 150 | let matches = true; 151 | this.varTags.forEach((tag) => { 152 | if (!contains(proposedTags, tag)) { 153 | matches = false; 154 | } 155 | }); 156 | return matches; 157 | } 158 | 159 | protected failMessage(failMessage: string, tag: string) { 160 | return tag[0].toUpperCase() + tag.substr(1) + " " + failMessage; 161 | } 162 | 163 | public checkName(name: ts.Identifier, walker: Lint.RuleWalker, tag: string) { 164 | let variableName = name.text; 165 | const firstCharacter = variableName[0]; 166 | const lastCharacter = variableName[variableName.length - 1]; 167 | 168 | // start with regex test before we potentially strip off underscores 169 | if ((this.regex !== null) && !variableName.match(this.regex)) { 170 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 171 | this.failMessage(REGEX_FAIL, tag))); 172 | } 173 | 174 | // check banned words before we potentially strip off underscores 175 | if (this.banKeywords && contains(BANNED_KEYWORDS, variableName)) { 176 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 177 | this.failMessage(KEYWORD_FAIL, tag))); 178 | } 179 | 180 | // check leading and trailing underscore 181 | if ("_" === firstCharacter) { 182 | if (!this.allowLeadingUnderscore && !this.requireLeadingUnderscore) { 183 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 184 | this.failMessage(LEADING_FAIL, tag))); 185 | } 186 | variableName = variableName.slice(1); 187 | } else if (this.requireLeadingUnderscore) { 188 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 189 | this.failMessage(NO_LEADING_FAIL, tag))); 190 | } 191 | 192 | if (("_" === lastCharacter) && (variableName.length > 0)) { 193 | if (!this.allowTrailingUnderscore && !this.requireTrailingUnderscore) { 194 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 195 | this.failMessage(TRAILING_FAIL, tag))); 196 | } 197 | variableName = variableName.slice(0, -1); 198 | } else if (this.requireTrailingUnderscore) { 199 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 200 | this.failMessage(NO_TRAILING_FAIL, tag))); 201 | } 202 | 203 | // run case checks 204 | if ((PASCAL_OPTION === this.caseCheck) && !isPascalCased(variableName)) { 205 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 206 | this.failMessage(PASCAL_FAIL, tag))); 207 | } else if ((CAMEL_OPTION === this.caseCheck) && !isCamelCase(variableName)) { 208 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 209 | this.failMessage(CAMEL_FAIL, tag))); 210 | } else if ((SNAKE_OPTION === this.caseCheck) && !isSnakeCase(variableName)) { 211 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 212 | this.failMessage(SNAKE_FAIL, tag))); 213 | } else if ((UPPER_OPTION === this.caseCheck) && !isUpperCase(variableName)) { 214 | walker.addFailure(walker.createFailure(name.getStart(), name.getWidth(), 215 | this.failMessage(UPPER_FAIL, tag))); 216 | } 217 | } 218 | } 219 | 220 | 221 | class VariableNameWalker extends Lint.RuleWalker { 222 | public checkers: VariableChecker[] = []; 223 | 224 | constructor(sourceFile: ts.SourceFile, options: Lint.IOptions) { 225 | super(sourceFile, options); 226 | 227 | let sub_rules = options.ruleArguments; 228 | 229 | sub_rules.forEach((rule_opts: any[]) => { 230 | this.checkers.push(new VariableChecker(rule_opts)); 231 | }); 232 | } 233 | 234 | public visitClassDeclaration(node: ts.ClassDeclaration) { 235 | // classes declared as default exports will be unnamed 236 | this.checkName(node, CLASS_TAG); 237 | super.visitClassDeclaration(node); 238 | } 239 | 240 | public visitMethodDeclaration(node: ts.MethodDeclaration) { 241 | this.checkName(node, METHOD_TAG); 242 | super.visitMethodDeclaration(node); 243 | } 244 | 245 | public visitInterfaceDeclaration(node: ts.InterfaceDeclaration) { 246 | this.checkName(node, INTERFACE_TAG); 247 | super.visitInterfaceDeclaration(node); 248 | } 249 | 250 | // what is this? 251 | public visitBindingElement(node: ts.BindingElement) { 252 | this.checkName(node, VARIABLE_TAG); 253 | super.visitBindingElement(node); 254 | } 255 | 256 | public visitParameterDeclaration(node: ts.ParameterDeclaration) { 257 | const parameterProperty: boolean = 258 | Lint.hasModifier(node.modifiers, ts.SyntaxKind.PublicKeyword) || 259 | Lint.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword) || 260 | Lint.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword); 261 | 262 | this.checkName(node, parameterProperty ? PROPERTY_TAG : PARAMETER_TAG); 263 | super.visitParameterDeclaration(node); 264 | } 265 | 266 | public visitPropertyDeclaration(node: ts.PropertyDeclaration) { 267 | this.checkName(node, PROPERTY_TAG); 268 | super.visitPropertyDeclaration(node); 269 | } 270 | 271 | public visitSetAccessor(node: ts.SetAccessorDeclaration) { 272 | this.checkName(node, PROPERTY_TAG); 273 | super.visitSetAccessor(node); 274 | } 275 | 276 | public visitGetAccessor(node: ts.GetAccessorDeclaration) { 277 | this.checkName(node, PROPERTY_TAG); 278 | super.visitGetAccessor(node); 279 | } 280 | 281 | public visitVariableDeclaration(node: ts.VariableDeclaration) { 282 | this.checkName(node, VARIABLE_TAG); 283 | super.visitVariableDeclaration(node); 284 | } 285 | 286 | public visitVariableStatement(node: ts.VariableStatement) { 287 | // skip 'declare' keywords 288 | if (!Lint.hasModifier(node.modifiers, ts.SyntaxKind.DeclareKeyword)) { 289 | super.visitVariableStatement(node); 290 | } 291 | } 292 | 293 | public visitFunctionDeclaration(node: ts.FunctionDeclaration) { 294 | this.checkName(node, FUNCTION_TAG); 295 | super.visitFunctionDeclaration(node); 296 | } 297 | 298 | protected checkName(node: ts.NamedDeclaration, tag: string) { 299 | if (node.name && node.name.kind === ts.SyntaxKind.Identifier) { 300 | const matching_checker = this.getMatchingChecker(this.getNodeTags(node, tag)); 301 | if (matching_checker !== null) { 302 | matching_checker.checkName( node.name, this, tag); 303 | } 304 | } 305 | } 306 | 307 | protected getMatchingChecker(varTags: string[]): VariableChecker | null { 308 | let matching_checkers = this.checkers.filter(checker => checker.requiredTagsFound(varTags)); 309 | if (matching_checkers.length > 0) { 310 | return matching_checkers[0]; 311 | } else { 312 | return null; 313 | } 314 | } 315 | 316 | protected getNodeTags(node: ts.Node, primaryTag: string): string[] { 317 | let tags = [primaryTag]; 318 | 319 | if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.StaticKeyword)) { 320 | tags.push(STATIC_TAG); 321 | } 322 | if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.ConstKeyword)) { 323 | tags.push(CONST_TAG); 324 | } 325 | 326 | if (primaryTag === PROPERTY_TAG || primaryTag === METHOD_TAG) { 327 | if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword)) { 328 | tags.push(PRIVATE_TAG); 329 | } else if (Lint.hasModifier(node.modifiers, ts.SyntaxKind.ProtectedKeyword)) { 330 | tags.push(PROTECTED_TAG); 331 | } else { 332 | // xxx: should fix so only get public when it is a property 333 | tags.push(PUBLIC_TAG); 334 | } 335 | } 336 | 337 | let nearest_body = nearestBody(node); 338 | if (!nearest_body.isSourceFile) { 339 | tags.push(LOCAL_TAG); 340 | } 341 | 342 | if (node.kind === ts.SyntaxKind.VariableDeclaration) { 343 | if (isConstVariable(node)) { 344 | tags.push(CONST_TAG); 345 | } 346 | } 347 | return tags; 348 | } 349 | } 350 | 351 | function nearestBody(node: ts.Node): {isSourceFile: boolean, containingBody: ts.Node | undefined} { 352 | const VALID_PARENT_TYPES = [ 353 | ts.SyntaxKind.SourceFile, 354 | ts.SyntaxKind.FunctionDeclaration, 355 | ts.SyntaxKind.FunctionExpression, 356 | ts.SyntaxKind.ArrowFunction, 357 | ts.SyntaxKind.MethodDeclaration, 358 | ts.SyntaxKind.Constructor, 359 | ]; 360 | let ancestor = node.parent; 361 | 362 | while (ancestor && !contains(VALID_PARENT_TYPES, ancestor.kind)) { 363 | ancestor = ancestor.parent; 364 | } 365 | 366 | return { 367 | containingBody: ancestor, 368 | isSourceFile: (ancestor && ancestor.kind === ts.SyntaxKind.SourceFile) || !ancestor, 369 | }; 370 | } 371 | 372 | function isConstVariable(node: ts.VariableDeclaration | ts.VariableStatement): boolean { 373 | const parentNode = (node.kind === ts.SyntaxKind.VariableDeclaration) 374 | ? ( node).parent 375 | : ( node).declarationList; 376 | 377 | return !parentNode || Lint.isNodeFlagSet(parentNode, ts.NodeFlags.Const); 378 | } 379 | 380 | function isPascalCased(name: string) { 381 | if (name.length <= 0) { 382 | return true; 383 | } 384 | 385 | const firstCharacter = name.charAt(0); 386 | return ((firstCharacter === firstCharacter.toUpperCase()) && name.indexOf("_") === -1); 387 | } 388 | 389 | function isCamelCase(name: string) { 390 | const firstCharacter = name.charAt(0); 391 | 392 | if (name.length <= 0) { 393 | return true; 394 | } 395 | 396 | if (!isLowerCase(firstCharacter)) { 397 | return false; 398 | } 399 | return name.indexOf("_") === -1; 400 | } 401 | 402 | function isSnakeCase(name: string) { 403 | return isLowerCase(name); 404 | } 405 | 406 | function isLowerCase(name: string) { 407 | return name === name.toLowerCase(); 408 | } 409 | 410 | function isUpperCase(name: string) { 411 | return name === name.toUpperCase(); 412 | } 413 | 414 | function contains(arr: any[], value: any): boolean { 415 | return arr.indexOf(value) !== -1; 416 | } 417 | 418 | export class Rule extends Lint.Rules.AbstractRule { 419 | public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { 420 | const variableNameWalker = new VariableNameWalker(sourceFile, this.getOptions()); 421 | return this.applyWithWalker(variableNameWalker); 422 | } 423 | } 424 | 425 | /** 426 | * Original version based upon variable-name rule: 427 | * 428 | * @license 429 | * Copyright 2013 Palantir Technologies, Inc. 430 | * 431 | * Licensed under the Apache License, Version 2.0 (the "License"); 432 | * you may not use this file except in compliance with the License. 433 | * You may obtain a copy of the License at 434 | * 435 | * http://www.apache.org/licenses/LICENSE-2.0 436 | * 437 | * Unless required by applicable law or agreed to in writing, software 438 | * distributed under the License is distributed on an "AS IS" BASIS, 439 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 440 | * See the License for the specific language governing permissions and 441 | * limitations under the License. 442 | */ 443 | -------------------------------------------------------------------------------- /rules/index.js: -------------------------------------------------------------------------------- 1 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0= -------------------------------------------------------------------------------- /rules/index.ts: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /rules/literalSpacingRule.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __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 | })(); 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | var Lint = require("tslint"); 14 | var ts = require("typescript"); 15 | var NEVER_FAIL = "Found extra space"; 16 | var ALWAYS_FAIL = "Missing whitespace"; 17 | var NEVER_OPT = "never"; 18 | var ALWAYS_OPT = "always"; 19 | var LiteralSpacingRuleWalker = (function (_super) { 20 | __extends(LiteralSpacingRuleWalker, _super); 21 | function LiteralSpacingRuleWalker(sourceFile, options) { 22 | var _this = _super.call(this, sourceFile, options) || this; 23 | _this.arrayCheck = NEVER_OPT; 24 | _this.objCheck = NEVER_OPT; 25 | _this.importCheck = NEVER_OPT; 26 | var array_opts = _this.getOption("array", []); 27 | var obj_opts = _this.getOption("object", []); 28 | var import_opts = _this.getOption("import", []); 29 | _this.arrayCheck = contains(array_opts, ALWAYS_OPT) ? ALWAYS_OPT : NEVER_OPT; 30 | _this.objCheck = contains(obj_opts, ALWAYS_OPT) ? ALWAYS_OPT : NEVER_OPT; 31 | _this.importCheck = contains(import_opts, ALWAYS_OPT) ? ALWAYS_OPT : NEVER_OPT; 32 | return _this; 33 | } 34 | LiteralSpacingRuleWalker.prototype.getOption = function (option, defVal) { 35 | var allOptions = this.getOptions(); 36 | if (allOptions == null || allOptions.length === 0) { 37 | return defVal; 38 | } 39 | return allOptions[0][option]; 40 | }; 41 | LiteralSpacingRuleWalker.prototype.visitArrayLiteralExpression = function (node) { 42 | this.lintNode(node, this.arrayCheck); 43 | _super.prototype.visitArrayLiteralExpression.call(this, node); 44 | }; 45 | LiteralSpacingRuleWalker.prototype.visitBindingPattern = function (node) { 46 | if (node.kind === ts.SyntaxKind.ArrayBindingPattern) { 47 | this.lintNode(node, this.arrayCheck); 48 | } 49 | if (node.kind === ts.SyntaxKind.ObjectBindingPattern) { 50 | this.lintNode(node, this.objCheck); 51 | } 52 | _super.prototype.visitBindingPattern.call(this, node); 53 | }; 54 | LiteralSpacingRuleWalker.prototype.visitNamedImports = function (node) { 55 | this.lintNode(node, this.importCheck); 56 | _super.prototype.visitNamedImports.call(this, node); 57 | }; 58 | LiteralSpacingRuleWalker.prototype.visitObjectLiteralExpression = function (node) { 59 | this.lintNode(node, this.objCheck); 60 | _super.prototype.visitObjectLiteralExpression.call(this, node); 61 | }; 62 | LiteralSpacingRuleWalker.prototype.lintNode = function (node, checkType) { 63 | var children = node.getChildren(); 64 | var self = this; 65 | if (children.length < 3) { 66 | return; 67 | } 68 | var second_child = children[1]; 69 | var last_child = children[children.length - 1]; 70 | var is_empty = second_child.getText() === ""; 71 | var _a = [second_child.getFullStart(), second_child.getStart()], front_start = _a[0], front_end = _a[1]; 72 | var _b = [last_child.getFullStart(), last_child.getStart()], back_start = _b[0], back_end = _b[1]; 73 | var front_text = this.getSourceText(front_start, front_end); 74 | var back_text = this.getSourceText(back_start, back_end); 75 | function doCheck(edgeText, nodeEdgeChar, start, end) { 76 | if ((NEVER_OPT === checkType) && 77 | ((edgeText.length > 0) || (nodeEdgeChar === " ")) && 78 | (edgeText.indexOf("\n") === -1)) { 79 | var len = Math.max((end - start), 1); 80 | self.addFailure(self.createFailure(start, len, NEVER_FAIL)); 81 | } 82 | if (ALWAYS_OPT === checkType) { 83 | if ((!is_empty) && 84 | (edgeText.length === 0) && 85 | (nodeEdgeChar !== " ")) { 86 | self.addFailure(self.createFailure(start, 1, ALWAYS_FAIL)); 87 | } 88 | } 89 | } 90 | doCheck(front_text, second_child.getText()[0], front_start, front_end); 91 | doCheck(back_text, last_child.getText()[-1], back_start, back_end); 92 | }; 93 | LiteralSpacingRuleWalker.prototype.getSourceText = function (pos, end) { 94 | return this.getSourceFile().text.substring(pos, end); 95 | }; 96 | return LiteralSpacingRuleWalker; 97 | }(Lint.RuleWalker)); 98 | function contains(arr, value) { 99 | return arr && arr.indexOf(value) !== -1; 100 | } 101 | var Rule = (function (_super) { 102 | __extends(Rule, _super); 103 | function Rule() { 104 | return _super !== null && _super.apply(this, arguments) || this; 105 | } 106 | Rule.prototype.apply = function (sourceFile) { 107 | return this.applyWithWalker(new LiteralSpacingRuleWalker(sourceFile, this.getOptions())); 108 | }; 109 | return Rule; 110 | }(Lint.Rules.AbstractRule)); 111 | exports.Rule = Rule; 112 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl0ZXJhbFNwYWNpbmdSdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGl0ZXJhbFNwYWNpbmdSdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQW9CQSw2QkFBK0I7QUFDL0IsK0JBQWlDO0FBRWpDLElBQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDO0FBQ3ZDLElBQU0sV0FBVyxHQUFHLG9CQUFvQixDQUFDO0FBRXpDLElBQU0sU0FBUyxHQUFJLE9BQU8sQ0FBQztBQUMzQixJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUM7QUFFNUI7SUFBdUMsNENBQWU7SUFLbEQsa0NBQVksVUFBeUIsRUFBRSxPQUFzQjtRQUE3RCxZQUNJLGtCQUFNLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FTN0I7UUFkTSxnQkFBVSxHQUFZLFNBQVMsQ0FBQztRQUNoQyxjQUFRLEdBQWMsU0FBUyxDQUFDO1FBQ2hDLGlCQUFXLEdBQVcsU0FBUyxDQUFDO1FBS25DLElBQUksVUFBVSxHQUFJLEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLElBQUksUUFBUSxHQUFNLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLElBQUksV0FBVyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLEtBQUksQ0FBQyxVQUFVLEdBQUksUUFBUSxDQUFDLFVBQVUsRUFBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDOUUsS0FBSSxDQUFDLFFBQVEsR0FBTSxRQUFRLENBQUMsUUFBUSxFQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RSxLQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUs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 -------------------------------------------------------------------------------- /rules/literalSpacingRule.ts: -------------------------------------------------------------------------------- 1 | /* KEEP IN SYNC with README.md 2 | 3 | ## literal-spacing 4 | 5 | Rule to enforce consistent spacing inside array and object literals. 6 | 7 | See: eslint: object-curly-spacing and array-bracket-spacing 8 | 9 | ```javascript 10 | "literal-spacing": [ 11 | true, 12 | { 13 | "array": ["always"], 14 | "object": ["never"], 15 | "import": ["always"] 16 | } 17 | ] 18 | ``` 19 | */ 20 | 21 | import * as Lint from "tslint"; 22 | import * as ts from "typescript"; 23 | 24 | const NEVER_FAIL = "Found extra space"; 25 | const ALWAYS_FAIL = "Missing whitespace"; 26 | 27 | const NEVER_OPT = "never"; 28 | const ALWAYS_OPT = "always"; 29 | 30 | class LiteralSpacingRuleWalker extends Lint.RuleWalker { 31 | public arrayCheck: string = NEVER_OPT; 32 | public objCheck: string = NEVER_OPT; 33 | public importCheck: string = NEVER_OPT; 34 | 35 | constructor(sourceFile: ts.SourceFile, options: Lint.IOptions) { 36 | super(sourceFile, options); 37 | 38 | let array_opts = this.getOption("array", []); 39 | let obj_opts = this.getOption("object", []); 40 | let import_opts = this.getOption("import", []); 41 | 42 | this.arrayCheck = contains(array_opts, ALWAYS_OPT) ? ALWAYS_OPT : NEVER_OPT; 43 | this.objCheck = contains(obj_opts, ALWAYS_OPT) ? ALWAYS_OPT : NEVER_OPT; 44 | this.importCheck = contains(import_opts, ALWAYS_OPT) ? ALWAYS_OPT : NEVER_OPT; 45 | } 46 | 47 | protected getOption(option: string, defVal: any) { 48 | const allOptions = this.getOptions(); 49 | if (allOptions == null || allOptions.length === 0) { 50 | return defVal; 51 | } 52 | 53 | return allOptions[0][option]; 54 | } 55 | 56 | protected visitArrayLiteralExpression(node: ts.ArrayLiteralExpression) { 57 | this.lintNode(node, this.arrayCheck); 58 | super.visitArrayLiteralExpression(node); 59 | } 60 | 61 | protected visitBindingPattern(node: ts.BindingPattern) { 62 | if (node.kind === ts.SyntaxKind.ArrayBindingPattern) { 63 | this.lintNode(node, this.arrayCheck); 64 | } 65 | if (node.kind === ts.SyntaxKind.ObjectBindingPattern) { 66 | this.lintNode(node, this.objCheck); 67 | } 68 | super.visitBindingPattern(node); 69 | } 70 | 71 | protected visitNamedImports(node: ts.NamedImports) { 72 | this.lintNode(node, this.importCheck); 73 | super.visitNamedImports(node); 74 | } 75 | 76 | protected visitObjectLiteralExpression(node: ts.ObjectLiteralExpression) { 77 | this.lintNode(node, this.objCheck); 78 | super.visitObjectLiteralExpression(node); 79 | } 80 | 81 | protected lintNode(node: ts.Node, checkType: string) { 82 | // Assume that we have list of children where first child is [ or { and last is } or ] 83 | const children = node.getChildren(); 84 | const self = this; 85 | 86 | if (children.length < 3) { 87 | return; 88 | } 89 | // const first_child = children[0]; // " [" 90 | const second_child = children[1]; // " 1, 3, 5," 91 | const last_child = children[children.length - 1]; // " ]" 92 | const is_empty = second_child.getText() === ""; 93 | 94 | let [front_start, front_end] = [second_child.getFullStart(), second_child.getStart()]; 95 | let [back_start, back_end] = [last_child.getFullStart(), last_child.getStart()]; 96 | 97 | let front_text = this.getSourceText(front_start, front_end); 98 | let back_text = this.getSourceText(back_start, back_end); 99 | 100 | // outerText: the string between the full edge and the start of the node content 101 | // nodeEdgeChar: the first character of the node content 102 | function doCheck(edgeText: string, nodeEdgeChar: string, start: number, end: number) { 103 | if ((NEVER_OPT === checkType) && 104 | ((edgeText.length > 0) || (nodeEdgeChar === " ")) && 105 | (edgeText.indexOf("\n") === -1)) { 106 | const len = Math.max((end - start), 1); 107 | self.addFailure(self.createFailure(start, len, NEVER_FAIL)); 108 | } 109 | 110 | if (ALWAYS_OPT === checkType) { 111 | if ((!is_empty) && 112 | (edgeText.length === 0) && 113 | (nodeEdgeChar !== " ")) { 114 | self.addFailure(self.createFailure(start, 1, ALWAYS_FAIL)); 115 | } 116 | } 117 | } 118 | 119 | doCheck(front_text, second_child.getText()[0], front_start, front_end); 120 | doCheck(back_text, last_child.getText()[-1], back_start, back_end); 121 | } 122 | 123 | protected getSourceText(pos: number, end: number): string { 124 | return this.getSourceFile().text.substring(pos, end); 125 | } 126 | } 127 | 128 | function contains(arr: any[], value: any): boolean { 129 | return arr && arr.indexOf(value) !== -1; 130 | } 131 | 132 | export class Rule extends Lint.Rules.AbstractRule { 133 | public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { 134 | return this.applyWithWalker(new LiteralSpacingRuleWalker(sourceFile, this.getOptions())); 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /rules/maxParamsRule.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __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 | })(); 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | var Lint = require("tslint"); 14 | var MaxParamsRuleWalker = (function (_super) { 15 | __extends(MaxParamsRuleWalker, _super); 16 | function MaxParamsRuleWalker(sourceFile, options) { 17 | var _this = _super.call(this, sourceFile, options) || this; 18 | _this.maxCount = 3; 19 | _this.failureStr = ""; 20 | if (options.ruleArguments.length > 0) { 21 | _this.maxCount = options.ruleArguments[0]; 22 | } 23 | _this.failureStr = "More than max-params: " + _this.maxCount; 24 | return _this; 25 | } 26 | MaxParamsRuleWalker.prototype.visitMethodDeclaration = function (node) { 27 | this.checkParams(node.parameters); 28 | _super.prototype.visitMethodDeclaration.call(this, node); 29 | }; 30 | MaxParamsRuleWalker.prototype.visitFunctionDeclaration = function (node) { 31 | this.checkParams(node.parameters); 32 | _super.prototype.visitFunctionDeclaration.call(this, node); 33 | }; 34 | MaxParamsRuleWalker.prototype.visitFunctionExpression = function (node) { 35 | this.checkParams(node.parameters); 36 | _super.prototype.visitFunctionExpression.call(this, node); 37 | }; 38 | MaxParamsRuleWalker.prototype.visitArrowFunction = function (node) { 39 | this.checkParams(node.parameters); 40 | _super.prototype.visitArrowFunction.call(this, node); 41 | }; 42 | MaxParamsRuleWalker.prototype.checkParams = function (params) { 43 | if (params.length > this.maxCount) { 44 | var first_param = params[0]; 45 | var last_param = params[params.length - 1]; 46 | var width = last_param.getEnd() - first_param.getStart(); 47 | this.addFailure(this.createFailure(first_param.getStart(), width, this.failureStr)); 48 | } 49 | }; 50 | return MaxParamsRuleWalker; 51 | }(Lint.RuleWalker)); 52 | var Rule = (function (_super) { 53 | __extends(Rule, _super); 54 | function Rule() { 55 | return _super !== null && _super.apply(this, arguments) || this; 56 | } 57 | Rule.prototype.apply = function (sourceFile) { 58 | return this.applyWithWalker(new MaxParamsRuleWalker(sourceFile, this.getOptions())); 59 | }; 60 | return Rule; 61 | }(Lint.Rules.AbstractRule)); 62 | exports.Rule = Rule; 63 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4UGFyYW1zUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1heFBhcmFtc1J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBY0EsNkJBQStCO0FBSS9CO0lBQWtDLHVDQUFlO0lBSTdDLDZCQUFZLFVBQXlCLEVBQUUsT0FBc0I7UUFBN0QsWUFDSSxrQkFBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBTTdCO1FBVk0sY0FBUSxHQUFLLENBQUMsQ0FBQztRQUNmLGdCQUFVLEdBQUcsRUFBRSxDQUFDO1FBS25CLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkMsS0FBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxLQUFJLENBQUMsVUFBVSxHQUFHLDJCQUF5QixLQUFJLENBQUMsUUFBVSxDQUFDOztJQUMvRCxDQUFDO0lBRVMsb0RBQXNCLEdBQWhDLFVBQWlDLElBQTBCO1FBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLGlCQUFNLHNCQUFzQixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFUyxzREFBd0IsR0FBbEMsVUFBbUMsSUFBNEI7UUFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsaUJBQU0sd0JBQXdCLFlBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVTLHFEQUF1QixHQUFqQyxVQUFrQyxJQUEyQjtRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxpQkFBTSx1QkFBdUIsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVMsZ0RBQWtCLEdBQTVCLFVBQTZCLElBQXNCO1FBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLGlCQUFNLGtCQUFrQixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUyx5Q0FBVyxHQUFyQixVQUFzQixNQUE2QztRQUMvRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixJQUFJLFVBQVUsR0FBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRXpELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7SUFDTCxDQUFDO0lBQ0wsMEJBQUM7QUFBRCxDQUFDLEFBMUNELENBQWtDLElBQUksQ0FBQyxVQUFVLEdBMENoRDtBQUVEO0lBQTBCLHdCQUF1QjtJQUFqRDs7SUFJQSxDQUFDO0lBSFUsb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNMLFdBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBSWhEO0FBSlksb0JBQUkifQ== -------------------------------------------------------------------------------- /rules/maxParamsRule.ts: -------------------------------------------------------------------------------- 1 | /* KEEP IN SYNC with README.md 2 | 3 | ## max-params 4 | 5 | Rule to enforce a maximum number of parameters for functions and methods. 6 | 7 | ```javascript 8 | "max-params": [ 9 | true, 10 | 3 11 | ] 12 | ``` 13 | */ 14 | 15 | import * as Lint from "tslint"; 16 | import * as ts from "typescript"; 17 | 18 | 19 | class MaxParamsRuleWalker extends Lint.RuleWalker { 20 | public maxCount = 3; 21 | public failureStr = ""; 22 | 23 | constructor(sourceFile: ts.SourceFile, options: Lint.IOptions) { 24 | super(sourceFile, options); 25 | 26 | if (options.ruleArguments.length > 0) { 27 | this.maxCount = options.ruleArguments[0]; 28 | } 29 | this.failureStr = `More than max-params: ${this.maxCount}`; 30 | } 31 | 32 | protected visitMethodDeclaration(node: ts.MethodDeclaration) { 33 | this.checkParams(node.parameters); 34 | super.visitMethodDeclaration(node); 35 | } 36 | 37 | protected visitFunctionDeclaration(node: ts.FunctionDeclaration) { 38 | this.checkParams(node.parameters); 39 | super.visitFunctionDeclaration(node); 40 | } 41 | 42 | protected visitFunctionExpression(node: ts.FunctionExpression) { 43 | this.checkParams(node.parameters); 44 | super.visitFunctionExpression(node); 45 | } 46 | 47 | protected visitArrowFunction(node: ts.ArrowFunction) { 48 | this.checkParams(node.parameters); 49 | super.visitArrowFunction(node); 50 | } 51 | 52 | protected checkParams(params: ts.NodeArray) { 53 | if (params.length > this.maxCount) { 54 | let first_param = params[0]; 55 | let last_param = params[params.length - 1]; 56 | let width = last_param.getEnd() - first_param.getStart(); 57 | 58 | this.addFailure(this.createFailure(first_param.getStart(), width, this.failureStr)); 59 | } 60 | } 61 | } 62 | 63 | export class Rule extends Lint.Rules.AbstractRule { 64 | public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { 65 | return this.applyWithWalker(new MaxParamsRuleWalker(sourceFile, this.getOptions())); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /rules/multilineArrowRule.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __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 | })(); 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | var Lint = require("tslint"); 14 | var ts = require("typescript"); 15 | var PAREN_FAIL = "Multi-line arrow function must have parentheses around parameters."; 16 | var BLOCK_FAIL = "Multi-line arrow function must have block around body."; 17 | var MultilineArrowRuleWalker = (function (_super) { 18 | __extends(MultilineArrowRuleWalker, _super); 19 | function MultilineArrowRuleWalker(sourceFile, options) { 20 | var _this = _super.call(this, sourceFile, options) || this; 21 | _this.requireParens = false; 22 | _this.requireBlock = false; 23 | _this.requireParens = contains(options.ruleArguments, "require-parens"); 24 | _this.requireBlock = contains(options.ruleArguments, "require-block"); 25 | return _this; 26 | } 27 | MultilineArrowRuleWalker.prototype.visitArrowFunction = function (node) { 28 | var text = node.getText(); 29 | var body = node.body; 30 | var isMultiline = text.indexOf("\n") !== -1; 31 | if (isMultiline) { 32 | if (this.requireParens) { 33 | if (text.charAt(0) !== "(") { 34 | var params = node.parameters; 35 | var first_param = params[0]; 36 | var last_param = params[params.length - 1]; 37 | this.addFailure(this.createFailure(first_param.getStart(), last_param.getEnd() - first_param.getStart(), PAREN_FAIL)); 38 | } 39 | } 40 | if (this.requireBlock) { 41 | if (body && body.kind !== ts.SyntaxKind.Block) { 42 | this.addFailure(this.createFailure(body.getStart(), body.getWidth(), BLOCK_FAIL)); 43 | } 44 | } 45 | } 46 | _super.prototype.visitArrowFunction.call(this, node); 47 | }; 48 | return MultilineArrowRuleWalker; 49 | }(Lint.RuleWalker)); 50 | function contains(arr, value) { 51 | return arr.indexOf(value) !== -1; 52 | } 53 | var Rule = (function (_super) { 54 | __extends(Rule, _super); 55 | function Rule() { 56 | return _super !== null && _super.apply(this, arguments) || this; 57 | } 58 | Rule.prototype.apply = function (sourceFile) { 59 | return this.applyWithWalker(new MultilineArrowRuleWalker(sourceFile, this.getOptions())); 60 | }; 61 | return Rule; 62 | }(Lint.Rules.AbstractRule)); 63 | exports.Rule = Rule; 64 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlsaW5lQXJyb3dSdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXVsdGlsaW5lQXJyb3dSdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQWVBLDZCQUErQjtBQUMvQiwrQkFBaUM7QUFFakMsSUFBTSxVQUFVLEdBQUcsb0VBQW9FLENBQUM7QUFDeEYsSUFBTSxVQUFVLEdBQUcsd0RBQXdELENBQUM7QUFHNUU7SUFBdUMsNENBQWU7SUFJbEQsa0NBQVksVUFBeUIsRUFBRSxPQUFzQjtRQUE3RCxZQUNJLGtCQUFNLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FJN0I7UUFSTSxtQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QixrQkFBWSxHQUFJLEtBQUssQ0FBQztRQUt6QixLQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdkUsS0FBSSxDQUFDLFlBQVksR0FBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRyxlQUFlLENBQUMsQ0FBQzs7SUFDM0UsQ0FBQztJQUVTLHFEQUFrQixHQUE1QixVQUE2QixJQUFzQjtRQUMvQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUV2QixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRTlDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDZCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFFckIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN6QixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUMvQixJQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzlCLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUU3QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUN0QixVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxFQUM1QyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO1lBQ0wsQ0FBQztZQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RGLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELGlCQUFNLGtCQUFrQixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTCwrQkFBQztBQUFELENBQUMsQUF6Q0QsQ0FBdUMsSUFBSSxDQUFDLFVBQVUsR0F5Q3JEO0FBRUQsa0JBQWtCLEdBQVUsRUFBRSxLQUFVO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRDtJQUEwQix3QkFBdUI7SUFBakQ7O0lBSUEsQ0FBQztJQUhVLG9CQUFLLEdBQVosVUFBYSxVQUF5QjtRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFDTCxXQUFDO0FBQUQsQ0FBQyxBQUpELENBQTBCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUloRDtBQUpZLG9CQUFJIn0= -------------------------------------------------------------------------------- /rules/multilineArrowRule.ts: -------------------------------------------------------------------------------- 1 | /* KEEP IN SYNC with README.md 2 | 3 | ## multiline-arrow 4 | 5 | Rule to enforce various checks arrow functions that span multiple lines. 6 | 7 | ```javascript 8 | "multiline-arrow": [ 9 | true, 10 | "require-parens", 11 | "require-block" 12 | ] 13 | ``` 14 | */ 15 | 16 | import * as Lint from "tslint"; 17 | import * as ts from "typescript"; 18 | 19 | const PAREN_FAIL = "Multi-line arrow function must have parentheses around parameters."; 20 | const BLOCK_FAIL = "Multi-line arrow function must have block around body."; 21 | 22 | 23 | class MultilineArrowRuleWalker extends Lint.RuleWalker { 24 | public requireParens = false; 25 | public requireBlock = false; 26 | 27 | constructor(sourceFile: ts.SourceFile, options: Lint.IOptions) { 28 | super(sourceFile, options); 29 | 30 | this.requireParens = contains(options.ruleArguments, "require-parens"); 31 | this.requireBlock = contains(options.ruleArguments, "require-block"); 32 | } 33 | 34 | protected visitArrowFunction(node: ts.ArrowFunction) { 35 | const text = node.getText(); 36 | const body = node.body; 37 | 38 | const isMultiline = text.indexOf("\n") !== -1; 39 | 40 | if (isMultiline) { 41 | if (this.requireParens) { 42 | // Use simple stupid check that arrow function starts with "(" 43 | if (text.charAt(0) !== "(") { 44 | const params = node.parameters; 45 | const first_param = params[0]; 46 | const last_param = params[params.length - 1]; 47 | 48 | this.addFailure(this.createFailure(first_param.getStart(), 49 | last_param.getEnd() - first_param.getStart(), 50 | PAREN_FAIL)); 51 | } 52 | } 53 | 54 | if (this.requireBlock) { 55 | if (body && body.kind !== ts.SyntaxKind.Block) { 56 | this.addFailure(this.createFailure(body.getStart(), body.getWidth(), BLOCK_FAIL)); 57 | } 58 | } 59 | } 60 | 61 | super.visitArrowFunction(node); 62 | } 63 | 64 | } 65 | 66 | function contains(arr: any[], value: any): boolean { 67 | return arr.indexOf(value) !== -1; 68 | } 69 | 70 | export class Rule extends Lint.Rules.AbstractRule { 71 | public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { 72 | return this.applyWithWalker(new MultilineArrowRuleWalker(sourceFile, this.getOptions())); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /rules/preferCaseBlocksRule.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __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 | })(); 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | var Lint = require("tslint"); 14 | var ts = require("typescript"); 15 | var FAIL_STR = "Prefer blocks for case body"; 16 | var CaseBlockWalker = (function (_super) { 17 | __extends(CaseBlockWalker, _super); 18 | function CaseBlockWalker() { 19 | return _super !== null && _super.apply(this, arguments) || this; 20 | } 21 | CaseBlockWalker.prototype.visitDefaultClause = function (node) { 22 | this.checkCaseClause(node); 23 | _super.prototype.visitDefaultClause.call(this, node); 24 | }; 25 | CaseBlockWalker.prototype.visitCaseClause = function (node) { 26 | this.checkCaseClause(node); 27 | _super.prototype.visitCaseClause.call(this, node); 28 | }; 29 | CaseBlockWalker.prototype.checkCaseClause = function (node) { 30 | if ((node.statements.length > 1) || 31 | ((node.statements.length === 1) && 32 | (node.statements[0].kind !== ts.SyntaxKind.Block))) { 33 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), FAIL_STR)); 34 | } 35 | }; 36 | return CaseBlockWalker; 37 | }(Lint.RuleWalker)); 38 | var Rule = (function (_super) { 39 | __extends(Rule, _super); 40 | function Rule() { 41 | return _super !== null && _super.apply(this, arguments) || this; 42 | } 43 | Rule.prototype.apply = function (sourceFile) { 44 | return this.applyWithWalker(new CaseBlockWalker(sourceFile, this.getOptions())); 45 | }; 46 | return Rule; 47 | }(Lint.Rules.AbstractRule)); 48 | exports.Rule = Rule; 49 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyQ2FzZUJsb2Nrc1J1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmVmZXJDYXNlQmxvY2tzUnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFnQkEsNkJBQStCO0FBQy9CLCtCQUFpQztBQUVqQyxJQUFNLFFBQVEsR0FBRyw2QkFBNkIsQ0FBQztBQUUvQztJQUE4QixtQ0FBZTtJQUE3Qzs7SUF1QkEsQ0FBQztJQXJCYSw0Q0FBa0IsR0FBNUIsVUFBNkIsSUFBc0I7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixpQkFBTSxrQkFBa0IsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVMseUNBQWUsR0FBekIsVUFBMEIsSUFBbUI7UUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixpQkFBTSxlQUFlLFlBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVTLHlDQUFlLEdBQXpCLFVBQTBCLElBQXNDO1FBSTVELEVBQUUsQ0FBQyxDQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7Z0JBQzlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FDbEQsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7SUFDTCxDQUFDO0lBQ0wsc0JBQUM7QUFBRCxDQUFDLEFBdkJELENBQThCLElBQUksQ0FBQyxVQUFVLEdBdUI1QztBQUVEO0lBQTBCLHdCQUF1QjtJQUFqRDs7SUFJQSxDQUFDO0lBSFUsb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksZUFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFDTCxXQUFDO0FBQUQsQ0FBQyxBQUpELENBQTBCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUloRDtBQUpZLG9CQUFJIn0= -------------------------------------------------------------------------------- /rules/preferCaseBlocksRule.ts: -------------------------------------------------------------------------------- 1 | /* KEEP IN SYNC with README.md 2 | 3 | ## prefer-case-blocks 4 | 5 | This rule checks to make sure that all case clauses use a block 6 | around the statements of the case. This helps to protect against 7 | issues with lexcical declarations that would become visible to the 8 | entire switch statement. 9 | 10 | To maintain consistency, the rule requires a block in all cases. 11 | 12 | ```javascript 13 | "prefer-case-blocks": true 14 | ``` 15 | */ 16 | 17 | import * as Lint from "tslint"; 18 | import * as ts from "typescript"; 19 | 20 | const FAIL_STR = "Prefer blocks for case body"; 21 | 22 | class CaseBlockWalker extends Lint.RuleWalker { 23 | 24 | protected visitDefaultClause(node: ts.DefaultClause) { 25 | this.checkCaseClause(node); 26 | super.visitDefaultClause(node); 27 | } 28 | 29 | protected visitCaseClause(node: ts.CaseClause) { 30 | this.checkCaseClause(node); 31 | super.visitCaseClause(node); 32 | } 33 | 34 | protected checkCaseClause(node: ts.CaseClause | ts.DefaultClause) { 35 | // Fail if: 36 | // - statements > 1 OR 37 | // - 1 statement that is not a block 38 | if ( (node.statements.length > 1) || 39 | ((node.statements.length === 1) && 40 | (node.statements[0].kind !== ts.SyntaxKind.Block)) 41 | ) { 42 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), FAIL_STR)); 43 | } 44 | } 45 | } 46 | 47 | export class Rule extends Lint.Rules.AbstractRule { 48 | public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { 49 | return this.applyWithWalker(new CaseBlockWalker(sourceFile, this.getOptions())); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /rules/preferLiteralRule.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __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 | })(); 12 | Object.defineProperty(exports, "__esModule", { value: true }); 13 | var Lint = require("tslint"); 14 | var OBJECT_OPTION = "object"; 15 | var FUNCTION_OPTION = "function"; 16 | var ARRAY_OPTION = "array"; 17 | var OBJECT_FAIL = "Prefer literal object creation"; 18 | var FUNCTION_FAIL = "Prefer literal function creation"; 19 | var ARRAY_FAIL = "Prefer literal array creation"; 20 | var PreferLiteralWalker = (function (_super) { 21 | __extends(PreferLiteralWalker, _super); 22 | function PreferLiteralWalker(sourceFile, options) { 23 | var _this = _super.call(this, sourceFile, options) || this; 24 | _this.checkObject = false; 25 | _this.checkFunction = false; 26 | _this.checkArray = false; 27 | _this.checkObject = contains(options.ruleArguments, OBJECT_OPTION); 28 | _this.checkFunction = contains(options.ruleArguments, FUNCTION_OPTION); 29 | _this.checkArray = contains(options.ruleArguments, ARRAY_OPTION); 30 | return _this; 31 | } 32 | PreferLiteralWalker.prototype.visitNewExpression = function (node) { 33 | var functionName = getFunctionName(node); 34 | if (this.checkObject && functionName === "Object") { 35 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), OBJECT_FAIL)); 36 | } 37 | if (this.checkFunction && functionName === "Function") { 38 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), FUNCTION_FAIL)); 39 | } 40 | if (this.checkArray && functionName === "Array") { 41 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), ARRAY_FAIL)); 42 | } 43 | _super.prototype.visitNewExpression.call(this, node); 44 | }; 45 | return PreferLiteralWalker; 46 | }(Lint.RuleWalker)); 47 | function getFunctionName(node) { 48 | var expression = node.expression; 49 | var functionName = expression.text; 50 | if (functionName === undefined && expression.name) { 51 | functionName = expression.name.text; 52 | } 53 | return functionName; 54 | } 55 | function contains(arr, value) { 56 | return arr.indexOf(value) !== -1; 57 | } 58 | var Rule = (function (_super) { 59 | __extends(Rule, _super); 60 | function Rule() { 61 | return _super !== null && _super.apply(this, arguments) || this; 62 | } 63 | Rule.prototype.apply = function (sourceFile) { 64 | return this.applyWithWalker(new PreferLiteralWalker(sourceFile, this.getOptions())); 65 | }; 66 | return Rule; 67 | }(Lint.Rules.AbstractRule)); 68 | exports.Rule = Rule; 69 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyTGl0ZXJhbFJ1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmVmZXJMaXRlcmFsUnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFrQkEsNkJBQStCO0FBRy9CLElBQU0sYUFBYSxHQUFLLFFBQVEsQ0FBQztBQUNqQyxJQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDbkMsSUFBTSxZQUFZLEdBQU0sT0FBTyxDQUFDO0FBRWhDLElBQU0sV0FBVyxHQUFLLGdDQUFnQyxDQUFDO0FBQ3ZELElBQU0sYUFBYSxHQUFHLGtDQUFrQyxDQUFDO0FBQ3pELElBQU0sVUFBVSxHQUFNLCtCQUErQixDQUFDO0FBRXREO0lBQWtDLHVDQUFlO0lBSzdDLDZCQUFZLFVBQXlCLEVBQUUsT0FBc0I7UUFBN0QsWUFDSSxrQkFBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLFNBSzdCO1FBVk0saUJBQVcsR0FBSyxLQUFLLENBQUM7UUFDdEIsbUJBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsZ0JBQVUsR0FBTSxLQUFLLENBQUM7UUFLekIsS0FBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBSSxhQUFhLENBQUMsQ0FBQztRQUNwRSxLQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLEtBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUssWUFBWSxDQUFDLENBQUM7O0lBQ3ZFLENBQUM7SUFFUyxnREFBa0IsR0FBNUIsVUFBNkIsSUFBc0I7UUFDL0MsSUFBSSxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxZQUFZLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLFlBQVksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELGlCQUFNLGtCQUFrQixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDTCwwQkFBQztBQUFELENBQUMsQUEzQkQsQ0FBa0MsSUFBSSxDQUFDLFVBQVUsR0EyQmhEO0FBRUQseUJBQXlCLElBQXNCO0lBQzVDLElBQUksVUFBVSxHQUFrQixJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ2hELElBQUksWUFBWSxHQUFzQixVQUFXLENBQUMsSUFBSSxDQUFDO0lBQ3ZELEVBQUUsQ0FBQyxDQUFDLFlBQVksS0FBSyxTQUFTLElBQVUsVUFBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEQsWUFBWSxHQUFTLFVBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzlDLENBQUM7SUFDRCxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxrQkFBa0IsR0FBVSxFQUFFLEtBQVU7SUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVEO0lBQTBCLHdCQUF1QjtJQUFqRDs7SUFJQSxDQUFDO0lBSFUsb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNMLFdBQUM7QUFBRCxDQUFDLEFBSkQsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBSWhEO0FBSlksb0JBQUkifQ== -------------------------------------------------------------------------------- /rules/preferLiteralRule.ts: -------------------------------------------------------------------------------- 1 | /* KEEP IN SYNC with README.md 2 | 3 | ## prefer-literal 4 | 5 | Prefer use of literals instead of calling new on Object, Array, and Function. 6 | 7 | Flags locations where code calls "new Object()", "new Array()", "new Function()"" 8 | 9 | ```javascript 10 | "prefer-literal": [ 11 | true, 12 | "object", 13 | "function", 14 | "array" 15 | ] 16 | ``` 17 | */ 18 | 19 | import * as Lint from "tslint"; 20 | import * as ts from "typescript"; 21 | 22 | const OBJECT_OPTION = "object"; 23 | const FUNCTION_OPTION = "function"; 24 | const ARRAY_OPTION = "array"; 25 | 26 | const OBJECT_FAIL = "Prefer literal object creation"; 27 | const FUNCTION_FAIL = "Prefer literal function creation"; 28 | const ARRAY_FAIL = "Prefer literal array creation"; 29 | 30 | class PreferLiteralWalker extends Lint.RuleWalker { 31 | public checkObject = false; 32 | public checkFunction = false; 33 | public checkArray = false; 34 | 35 | constructor(sourceFile: ts.SourceFile, options: Lint.IOptions) { 36 | super(sourceFile, options); 37 | 38 | this.checkObject = contains(options.ruleArguments, OBJECT_OPTION); 39 | this.checkFunction = contains(options.ruleArguments, FUNCTION_OPTION); 40 | this.checkArray = contains(options.ruleArguments, ARRAY_OPTION); 41 | } 42 | 43 | protected visitNewExpression(node: ts.NewExpression): void { 44 | let functionName = getFunctionName(node); 45 | 46 | if (this.checkObject && functionName === "Object") { 47 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), OBJECT_FAIL)); 48 | } 49 | if (this.checkFunction && functionName === "Function") { 50 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), FUNCTION_FAIL)); 51 | } 52 | if (this.checkArray && functionName === "Array") { 53 | this.addFailure(this.createFailure(node.getStart(), node.getWidth(), ARRAY_FAIL)); 54 | } 55 | super.visitNewExpression(node); 56 | } 57 | } 58 | 59 | function getFunctionName(node: ts.NewExpression): string { 60 | let expression: ts.Expression = node.expression; 61 | let functionName: string = (expression).text; 62 | if (functionName === undefined && (expression).name) { 63 | functionName = (expression).name.text; 64 | } 65 | return functionName; 66 | } 67 | 68 | function contains(arr: any[], value: any): boolean { 69 | return arr.indexOf(value) !== -1; 70 | } 71 | 72 | export class Rule extends Lint.Rules.AbstractRule { 73 | public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { 74 | return this.applyWithWalker(new PreferLiteralWalker(sourceFile, this.getOptions())); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -v 3 | 4 | # Compile all rules 5 | #./node_modules/.bin/tsc -p . 6 | 7 | # Now run the tests 8 | #./node_modules/.bin/tslint --test test/rules/no-imports/default 9 | 10 | find test -type f -name '*.lint' -exec dirname {} \; | sort -u | xargs -n 1 ./node_modules/.bin/tslint --test --project . 11 | -------------------------------------------------------------------------------- /test/rules/conditional-expression-parens/default/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test for making sure parens are used with conditional expressions 3 | */ 4 | 5 | let b = true; 6 | 7 | let y = 20; 8 | 9 | let x = y > 30 ? "left" : "right"; 10 | ~~~~~~ [cond] 11 | let x2 = (y > 30 ? "left" : "right"); 12 | ~~~~~~ [cond] 13 | 14 | 15 | let x = (y > 30); 16 | 17 | let z = b ? "left" : "right"; 18 | 19 | let w = (y > 30) ? "left" : "right"; 20 | 21 | let w2 = ((y > 30) ? "left" : "right"); 22 | 23 | let y = doSomething() ? "left" : "right"; 24 | 25 | x = b ? Object : "string"; 26 | x = b ? [5,6] : {blah: "this"}; 27 | x = b ? 10 : /re/; 28 | 29 | x = b ? y + 10 : doSomething() < 20; 30 | ~~~~~~ [cond] 31 | ~~~~~~~~~~~~~~~~~~ [cond] 32 | 33 | [cond]: Expression clause must be parenthesized 34 | 35 | -------------------------------------------------------------------------------- /test/rules/conditional-expression-parens/default/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "conditional-expression-parens": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /test/rules/ext-variable-name/default/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test where everything should be in camel case 3 | */ 4 | 5 | var moduleCamel = "camel"; 6 | var ModulePascal = "pascal"; 7 | ~~~~~~~~~~~~ [Variable must be in camel case] 8 | const MODULE_CONST = "const" 9 | const another_const = "const" 10 | ~~~~~~~~~~~~~ [Variable must be in uppercase] 11 | var _noLeading = ""; 12 | ~~~~~~~~~~ [Variable name must not have leading underscore] 13 | var trailing_ = ""; 14 | ~~~~~~~~~ [Variable name must not have trailing underscore] 15 | var number = 42; 16 | ~~~~~~ [Variable name clashes with keyword/type] 17 | 18 | class BadParamPropClass { 19 | constructor(public badPublic_, protected BadPascal, private bad_snake) {} 20 | ~~~~~~~~~~ [Property name must not have trailing underscore] 21 | ~~~~~~~~~~ [Property must be in snake case] 22 | ~~~~~~~~~ [Property must be in camel case] 23 | ~~~~~~~~~ [Property must be in camel case] 24 | } 25 | 26 | class GoodParamPropClass { 27 | constructor(public good_public, protected goodProtected_, private _goodPrivate) {} 28 | } 29 | 30 | function varScope() { 31 | let localCamel = 10; 32 | ~~~~~~~~~~ [Variable must be in snake case] 33 | ~~~~~~~~~~ [Variable name must have leading underscore] 34 | let local_snake = 20; 35 | ~~~~~~~~~~~ [Variable name must have leading underscore] 36 | let _good_local = 42; 37 | let _number = 42; //allowed because of leading underscore 38 | 39 | function local_func() {} 40 | function localFunc() {} 41 | ~~~~~~~~~ [Function must be in snake case] 42 | } 43 | 44 | function snake_func() {} 45 | ~~~~~~~~~~ [Function must be in camel case] 46 | 47 | class camelClass {} 48 | ~~~~~~~~~~ [Class must be in pascal case] 49 | class UPPER_CLASS {} 50 | ~~~~~~~~~~~ [Class must be in pascal case] 51 | 52 | function innerScope() { 53 | class goodCamel {} 54 | class BadPascal {} 55 | ~~~~~~~~~ [Class must be in camel case] 56 | } 57 | 58 | interface PascalIface {} 59 | ~~~~~~~~~~~ [Interface name did not match required regex] 60 | interface IPascalIface {} 61 | 62 | class TestClass { 63 | private privCamel = 10; 64 | private _leadPriv = 10; 65 | private trailPriv_ = 10; 66 | ~~~~~~~~~~ [Property name must not have trailing underscore] 67 | private snake_priv = 10; 68 | ~~~~~~~~~~ [Property must be in camel case] 69 | 70 | protected protCamel = 10; 71 | protected _leadProt = 10; 72 | ~~~~~~~~~ [Property name must not have leading underscore] 73 | protected trailProt_ = 10; 74 | protected snake_prot = 10; 75 | ~~~~~~~~~~ [Property must be in camel case] 76 | 77 | public snake_pub = 10; 78 | public camelPub = 10; 79 | ~~~~~~~~ [Property must be in snake case] 80 | other_pub = 20; 81 | 82 | public get camelPubAcc() {} 83 | ~~~~~~~~~~~ [Property must be in snake case] 84 | public set camelPubAcc(var_) {} 85 | ~~~~~~~~~~~ [Property must be in snake case] 86 | private get snake_priv_acc() {} 87 | ~~~~~~~~~~~~~~ [Property must be in camel case] 88 | private set snake_priv_acc(var_) {} 89 | ~~~~~~~~~~~~~~ [Property must be in camel case] 90 | protected get snake_prot_acc() {} 91 | ~~~~~~~~~~~~~~ [Property must be in camel case] 92 | protected set snake_prot_acc(var_) {} 93 | ~~~~~~~~~~~~~~ [Property must be in camel case] 94 | } 95 | 96 | class AnotherClass { 97 | public doSomething() {} 98 | doSomethingElse() {} 99 | 100 | protected snake_method_() {} 101 | protected camelProt() {} 102 | ~~~~~~~~~ [Method must be in snake case] 103 | 104 | private _PascalPriv() {} 105 | private snake_priv_() {} 106 | ~~~~~~~~~~~ [Method must be in pascal case] 107 | ~~~~~~~~~~~ [Method name must not have trailing underscore] 108 | } 109 | 110 | class StaticClass { 111 | static const UPPER_CONST = 10; 112 | static const PascalConst = 20; 113 | ~~~~~~~~~~~ [Property must be in uppercase] 114 | 115 | static StaticConst = 20; 116 | static snake_const = 10; 117 | ~~~~~~~~~~~ [Property must be in pascal case] 118 | } 119 | 120 | class BaseClass { 121 | constructor() { 122 | const _lower_const = 10; 123 | const _short = "string"; 124 | let localCamel = 10; 125 | ~~~~~~~~~~ [Variable must be in snake case] 126 | ~~~~~~~~~~ [Variable name must have leading underscore] 127 | } 128 | 129 | doSomething(): void { 130 | let _lower_const = 10; 131 | let _short = "string"; 132 | let localCamel = 10; 133 | ~~~~~~~~~~ [Variable must be in snake case] 134 | ~~~~~~~~~~ [Variable name must have leading underscore] 135 | } 136 | } 137 | 138 | function testParams(noTrail, bad_param, _badLead, badTrail_) {} 139 | ~~~~~~~ [Parameter name must have trailing underscore] 140 | ~~~~~~~~~ [Parameter must be in camel case] 141 | ~~~~~~~~~ [Parameter name must have trailing underscore] 142 | ~~~~~~~~ [Parameter name must not have leading underscore] 143 | ~~~~~~~~ [Parameter name must have trailing underscore] 144 | let { foo, bar } = { foo: 1, bar: 2 }; 145 | let [ InvalidFoo, invalid_bar, ...invalid_baz ] = [1, 2, 3, 4]; 146 | ~~~~~~~~~~ [Variable must be in camel case] 147 | ~~~~~~~~~~~ [Variable must be in camel case] 148 | ~~~~~~~~~~~ [Variable must be in camel case] 149 | -------------------------------------------------------------------------------- /test/rules/ext-variable-name/default/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "ext-variable-name": [ 5 | true, 6 | ["variable", "local", "snake", "require-leading-underscore", "ban-keywords"], 7 | ["variable", "const", "upper"], 8 | ["variable", "camel", "ban-keywords"], 9 | 10 | ["class", "local", "camel"], 11 | ["class", "pascal"], 12 | 13 | ["interface", "pascal", {"regex": "^I.*$"}], 14 | 15 | ["function", "local", "snake"], 16 | ["function", "camel"], 17 | 18 | ["property", "static", "const", "upper"], 19 | ["property", "static", "pascal"], 20 | 21 | ["property", "private", "camel", "allow-leading-underscore"], 22 | ["property", "protected", "camel", "allow-trailing-underscore"], 23 | ["property", "public", "snake"], 24 | 25 | ["method", "public", "camel"], 26 | ["method", "protected", "snake", "allow-trailing-underscore"], 27 | ["method", "private", "pascal", "allow-leading-underscore"], 28 | 29 | ["parameter", "camel", "require-trailing-underscore"], 30 | 31 | 32 | ["default", {"regex": "^NOT_YET$"}] 33 | ] 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /test/rules/literal-spacing/always/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test for literal-spacing always 3 | */ 4 | 5 | var obj = {}; 6 | 7 | // fail always 8 | var obj = {'foo': 'bar'}; 9 | ~ [always] 10 | ~ [always] 11 | var obj = {'foo': 'bar' }; 12 | ~ [always] 13 | var obj = { baz: {'foo': 'qux'}, bar}; 14 | ~ [always] 15 | ~ [always] 16 | ~ [always] 17 | var obj = {baz: { 'foo': 'qux' }, bar}; 18 | ~ [always] 19 | ~ [always] 20 | var obj = {'foo': 'bar' 21 | ~ [always] 22 | }; 23 | var obj = { 24 | 'foo':'bar'}; 25 | ~ [always] 26 | var {x} = y; 27 | ~ [always] 28 | ~ [always] 29 | import {foo } from 'bar'; 30 | ~ [always] 31 | 32 | // pass always 33 | var obj = {}; 34 | var obj = { 'foo': 'bar' }; 35 | var obj = { 'foo': { 'bar': 'baz' }, 'qux': 'quxx' }; 36 | var obj = { 37 | 'foo': 'bar' 38 | }; 39 | var { x } = y; 40 | import { foo } from 'bar'; 41 | 42 | // fail always 43 | var arr = ['foo', 'bar']; 44 | ~ [always] 45 | ~ [always] 46 | var arr = ['foo', 'bar' ]; 47 | ~ [always] 48 | var arr = [ ['foo'], 'bar' ]; 49 | ~ [always] 50 | ~ [always] 51 | var arr = ['foo', 52 | ~ [always] 53 | 'bar' 54 | ]; 55 | var arr = [ 56 | 'foo', 57 | 'bar']; 58 | ~ [always] 59 | 60 | var [x, y] = z; 61 | ~ [always] 62 | ~ [always] 63 | var [x,y] = z; 64 | ~ [always] 65 | ~ [always] 66 | var [x, ...y] = z; 67 | ~ [always] 68 | ~ [always] 69 | var [,,x,] = z; 70 | ~ [always] 71 | ~ [always] 72 | 73 | // pass always 74 | var arr = []; 75 | var arr = [ 'foo', 'bar', 'baz' ]; 76 | var arr = [ [ 'foo' ], 'bar', 'baz' ]; 77 | var arr = [ 'foo', 78 | 'bar' 79 | ]; 80 | var arr = [ 81 | 'foo', 82 | 'bar' ]; 83 | var arr = [ 84 | 'foo', 85 | 'bar', 86 | 'baz' 87 | ]; 88 | 89 | var [ x, y ] = z; 90 | var [ x,y ] = z; 91 | var [ x, ...y ] = z; 92 | var [ ,,x, ] = z; 93 | 94 | 95 | [always]: Missing whitespace -------------------------------------------------------------------------------- /test/rules/literal-spacing/always/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "literal-spacing": [ 5 | true, 6 | { 7 | "array": ["always"], 8 | "object": ["always"], 9 | "import": ["always"] 10 | } 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/rules/literal-spacing/imports/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test for mix where objects are never and imports are always 3 | */ 4 | 5 | import {Blah, Other} from 'my/module'; 6 | ~ [missing] 7 | ~ [missing] 8 | 9 | import { Good, Stuff } from 'my/module2'; 10 | 11 | import { 12 | Multi, 13 | Line, 14 | } from 'my/module3'; 15 | 16 | // fail for never 17 | var obj = { 'foo': 'bar' }; 18 | ~ [never] 19 | ~ [never] 20 | var obj = {'foo': 'bar' }; 21 | ~ [never] 22 | 23 | 24 | [never]: Found extra space 25 | [missing]: Missing whitespace 26 | -------------------------------------------------------------------------------- /test/rules/literal-spacing/imports/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "literal-spacing": [ 5 | true, 6 | { 7 | "array": ["never"], 8 | "object": ["never"], 9 | "import": ["always"] 10 | } 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/rules/literal-spacing/never/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test for literal-spacing never 3 | */ 4 | 5 | 6 | // fail for never 7 | var obj = { 'foo': 'bar' }; 8 | ~ [never] 9 | ~ [never] 10 | var obj = {'foo': 'bar' }; 11 | ~ [never] 12 | var obj = { baz: {'foo': 'qux'}, bar}; 13 | ~ [never] 14 | var obj = {baz: { 'foo': 'qux'}, bar}; 15 | ~ [never] 16 | var {x } = y; 17 | ~ [never] 18 | import { foo } from 'bar'; 19 | ~ [never] 20 | ~ [never] 21 | 22 | // work for never 23 | var obj = {'foo': 'bar'}; 24 | var obj = {'foo': {'bar': 'baz'}, 'qux': 'quxx'}; 25 | var obj = { 26 | 'foo': 'bar' 27 | }; 28 | var obj = {'foo': 'bar' 29 | }; 30 | var obj = { 31 | 'foo':'bar'}; 32 | var obj = {}; 33 | var {x} = y; 34 | import {foo} from 'bar'; 35 | 36 | // fail for never 37 | var arr = [ ]; 38 | ~ [never] 39 | var arr = [ 'foo', 'bar' ]; 40 | ~ [never] 41 | ~ [never] 42 | var arr = ['foo', 'bar' ]; 43 | ~ [never] 44 | var arr = [ ['foo'], 'bar']; 45 | ~ [never] 46 | var arr = [[ 'foo' ], 'bar']; 47 | ~ [never] 48 | ~ [never] 49 | var arr = [ 'foo', 50 | ~ [never] 51 | 'bar' 52 | ]; 53 | var [ x, y ] = z; 54 | ~ [never] 55 | ~ [never] 56 | var [ x,y ] = z; 57 | ~ [never] 58 | ~ [never] 59 | var [ x, ...y ] = z; 60 | ~ [never] 61 | ~ [never] 62 | var [ ,,x, ] = z; 63 | ~ [never] 64 | ~ [never] 65 | 66 | // work for never 67 | var arr = []; 68 | var arr = ['foo', 'bar', 'baz']; 69 | var arr = [['foo'], 'bar', 'baz']; 70 | var arr = [ 71 | 'foo', 72 | 'bar', 73 | 'baz' 74 | ]; 75 | var arr = ['foo', 76 | 'bar' 77 | ]; 78 | var arr = [ 79 | 'foo', 80 | 'bar']; 81 | 82 | var [x, y] = z; 83 | var [x,y] = z; 84 | var [x, ...y] = z; 85 | var [,,x,] = z; 86 | 87 | 88 | [never]: Found extra space 89 | -------------------------------------------------------------------------------- /test/rules/literal-spacing/never/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "literal-spacing": [ 5 | true, 6 | { 7 | "array": ["never"], 8 | "object": ["never"], 9 | "import": ["never"] 10 | } 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/rules/max-params/default/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test for maximum number of parameters 3 | */ 4 | 5 | function func1(v1, v2, v3) {} 6 | 7 | function func2(v1, v2, v3, v4) {} 8 | ~~~~~~~~~~~~~~ [params] 9 | 10 | let b = function(v1, v2, v3, v4) {}; 11 | ~~~~~~~~~~~~~~ [params] 12 | 13 | 14 | let ar1 = (x, y, z) => { return 10; } 15 | 16 | let ar2 = (x, y, z, w) => { return 10; } 17 | ~~~~~~~~~~ [params] 18 | 19 | class TestClass { 20 | 21 | method1(v1, v2, v3) {} 22 | 23 | method2(v1, v2, v3, v4) {} 24 | ~~~~~~~~~~~~~~ [params] 25 | } 26 | 27 | 28 | [params]: More than max-params: 3 29 | -------------------------------------------------------------------------------- /test/rules/max-params/default/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "max-params": [true, 3] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /test/rules/multiline-arrow/default/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test of requiring paren and body for multi-line arrow 3 | */ 4 | 5 | let a = [1,2]; 6 | 7 | a.map( y => y * 2 ); 8 | 9 | a.map((z) => { return z * 2; }); 10 | 11 | a.map(c => 12 | ~ [paren] 13 | c * 2 14 | ~~~~~ [block] 15 | ); 16 | 17 | a.map((d) => 18 | d * 2 19 | ~~~~~ [block] 20 | }); 21 | 22 | a.map(z => 23 | ~ [paren] 24 | ({obj: 'literal'}) 25 | ~~~~~~~~~~~~~~~~~~ [block] 26 | ); 27 | 28 | a.map(() => { 29 | 10 30 | }); 31 | 32 | a.map(my_value => { 33 | ~~~~~~~~ [paren] 34 | my_value * 3; 35 | }); 36 | 37 | a.map((f) => { 38 | return f * 3; }); 39 | 40 | 41 | [paren]: Multi-line arrow function must have parentheses around parameters. 42 | [block]: Multi-line arrow function must have block around body. 43 | -------------------------------------------------------------------------------- /test/rules/multiline-arrow/default/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "multiline-arrow": [ 5 | true, 6 | "require-parens", 7 | "require-block" 8 | ] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /test/rules/prefer-case-blocks/default/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test for preferring use of blocks in case statements 3 | */ 4 | 5 | let foo = 10; 6 | 7 | switch (foo) { 8 | case 1: 9 | ~~~~~~~ 10 | let x = 5; 11 | ~~~~~~~~~~~~~~~~ 12 | break; 13 | ~~~~~~~~~~~~ [block] 14 | case 2: 15 | case 3: { 16 | let y = 3; 17 | break; 18 | } 19 | default: 20 | ~~~~~~~~ 21 | let z = 2; 22 | ~~~~~~~~~~~~~~~~ [block] 23 | } 24 | } 25 | 26 | [block]: Prefer blocks for case body 27 | -------------------------------------------------------------------------------- /test/rules/prefer-case-blocks/default/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "prefer-case-blocks": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /test/rules/prefer-literal/default/test.ts.lint: -------------------------------------------------------------------------------- 1 | /** 2 | Lint test for not using Object, Array, Function constructors. 3 | */ 4 | 5 | let x = new Object(); 6 | ~~~~~~~~~~~~ [object] 7 | 8 | if (x.constructor === Object) {} 9 | 10 | let y = new Array(); 11 | ~~~~~~~~~~~ [array] 12 | 13 | if (y.constructor === Array) {} 14 | 15 | let z = new Function(); 16 | ~~~~~~~~~~~~~~ [function] 17 | 18 | if (z.constructor === Function) {} 19 | 20 | 21 | [object]: Prefer literal object creation 22 | [function]: Prefer literal function creation 23 | [array]: Prefer literal array creation 24 | -------------------------------------------------------------------------------- /test/rules/prefer-literal/default/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": "../../../../rules", 3 | "rules": { 4 | "prefer-literal": [true, "object", "function", "array"] 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "lib": ["es6"], 6 | 7 | "noImplicitAny": true, 8 | "noImplicitReturns": true, 9 | "noUnusedLocals": true, 10 | "noUnusedParameters": true, 11 | "strictNullChecks": false, 12 | 13 | "removeComments": true, 14 | "inlineSourceMap": true, 15 | "preserveConstEnums": true 16 | } 17 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "./rules" 4 | ], 5 | "rules": { 6 | "class-name": true, 7 | "comment-format": [ 8 | true, 9 | "check-space" 10 | ], 11 | "curly": true, 12 | "eofline": true, 13 | "forin": true, 14 | "indent": [ 15 | true, 16 | "spaces" 17 | ], 18 | "label-position": true, 19 | "max-line-length": [ 20 | true, 21 | 140 22 | ], 23 | "member-access": true, 24 | "member-ordering": [ 25 | true, 26 | "public-before-private", 27 | "static-before-instance", 28 | "variables-before-functions" 29 | ], 30 | "no-arg": true, 31 | "no-bitwise": true, 32 | "no-console": [ 33 | true, 34 | "debug", 35 | "info", 36 | "time", 37 | "timeEnd", 38 | "trace" 39 | ], 40 | "no-construct": true, 41 | "no-debugger": true, 42 | "no-duplicate-variable": true, 43 | "no-empty": true, 44 | "no-eval": true, 45 | "no-inferrable-types": false, 46 | "no-shadowed-variable": true, 47 | "no-string-literal": true, 48 | "no-switch-case-fall-through": true, 49 | "no-trailing-whitespace": true, 50 | "no-unused-expression": true, 51 | "no-use-before-declare": true, 52 | "no-var-keyword": true, 53 | "object-literal-sort-keys": true, 54 | "one-line": [ 55 | true, 56 | "check-open-brace", 57 | "check-catch", 58 | "check-else", 59 | "check-finally", 60 | "check-whitespace" 61 | ], 62 | "quotemark": [ 63 | true, 64 | "double", 65 | "avoid-escape" 66 | ], 67 | "radix": true, 68 | "semicolon": [ 69 | true, 70 | "always" 71 | ], 72 | "trailing-comma": [ 73 | true, 74 | { 75 | "singleline": "never", 76 | "multiline": "always" 77 | } 78 | ], 79 | "triple-equals": [ 80 | true, 81 | "allow-null-check" 82 | ], 83 | "typedef-whitespace": [ 84 | true, 85 | { 86 | "call-signature": "nospace", 87 | "index-signature": "nospace", 88 | "parameter": "nospace", 89 | "property-declaration": "nospace", 90 | "variable-declaration": "nospace" 91 | } 92 | ], 93 | "variable-name": false, 94 | "whitespace": [ 95 | true, 96 | "check-branch", 97 | "check-decl", 98 | "check-operator", 99 | "check-separator", 100 | "check-type" 101 | ] 102 | } 103 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@^10.0.0": 6 | version "10.12.10" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.10.tgz#4fa76e6598b7de3f0cb6ec3abacc4f59e5b3a2ce" 8 | integrity sha512-8xZEYckCbUVgK8Eg7lf5Iy4COKJ5uXlnIOnePN0WUwSQggy9tolM+tDJf7wMOnT/JT/W9xDYIaYggt3mRV2O5w== 9 | 10 | abbrev@1: 11 | version "1.1.1" 12 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 13 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 14 | 15 | ansi-regex@^2.0.0: 16 | version "2.1.1" 17 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 18 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 19 | 20 | ansi-regex@^3.0.0: 21 | version "3.0.0" 22 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 23 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 24 | 25 | ansi-styles@^2.2.1: 26 | version "2.2.1" 27 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 28 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 29 | 30 | ansi-styles@^3.2.1: 31 | version "3.2.1" 32 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 33 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 34 | dependencies: 35 | color-convert "^1.9.0" 36 | 37 | anymatch@^2.0.0: 38 | version "2.0.0" 39 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" 40 | integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== 41 | dependencies: 42 | micromatch "^3.1.4" 43 | normalize-path "^2.1.1" 44 | 45 | aproba@^1.0.3: 46 | version "1.2.0" 47 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 48 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 49 | 50 | are-we-there-yet@~1.1.2: 51 | version "1.1.5" 52 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" 53 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== 54 | dependencies: 55 | delegates "^1.0.0" 56 | readable-stream "^2.0.6" 57 | 58 | arr-diff@^4.0.0: 59 | version "4.0.0" 60 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 61 | integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= 62 | 63 | arr-flatten@^1.1.0: 64 | version "1.1.0" 65 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 66 | integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== 67 | 68 | arr-union@^3.1.0: 69 | version "3.1.0" 70 | resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" 71 | integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= 72 | 73 | array-unique@^0.3.2: 74 | version "0.3.2" 75 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" 76 | integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= 77 | 78 | assign-symbols@^1.0.0: 79 | version "1.0.0" 80 | resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 81 | integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 82 | 83 | async-each@^1.0.0: 84 | version "1.0.1" 85 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 86 | integrity sha1-GdOGodntxufByF04iu28xW0zYC0= 87 | 88 | atob@^2.1.1: 89 | version "2.1.2" 90 | resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 91 | integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 92 | 93 | babel-code-frame@^6.22.0: 94 | version "6.26.0" 95 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 96 | integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= 97 | dependencies: 98 | chalk "^1.1.3" 99 | esutils "^2.0.2" 100 | js-tokens "^3.0.2" 101 | 102 | balanced-match@^1.0.0: 103 | version "1.0.0" 104 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 105 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 106 | 107 | base@^0.11.1: 108 | version "0.11.2" 109 | resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" 110 | integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== 111 | dependencies: 112 | cache-base "^1.0.1" 113 | class-utils "^0.3.5" 114 | component-emitter "^1.2.1" 115 | define-property "^1.0.0" 116 | isobject "^3.0.1" 117 | mixin-deep "^1.2.0" 118 | pascalcase "^0.1.1" 119 | 120 | binary-extensions@^1.0.0: 121 | version "1.12.0" 122 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" 123 | integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== 124 | 125 | bluebird@3.5.1: 126 | version "3.5.1" 127 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 128 | integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== 129 | 130 | brace-expansion@^1.1.7: 131 | version "1.1.11" 132 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 133 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 134 | dependencies: 135 | balanced-match "^1.0.0" 136 | concat-map "0.0.1" 137 | 138 | braces@^2.3.0, braces@^2.3.1: 139 | version "2.3.2" 140 | resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" 141 | integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== 142 | dependencies: 143 | arr-flatten "^1.1.0" 144 | array-unique "^0.3.2" 145 | extend-shallow "^2.0.1" 146 | fill-range "^4.0.0" 147 | isobject "^3.0.1" 148 | repeat-element "^1.1.2" 149 | snapdragon "^0.8.1" 150 | snapdragon-node "^2.0.1" 151 | split-string "^3.0.2" 152 | to-regex "^3.0.1" 153 | 154 | builtin-modules@^1.1.1: 155 | version "1.1.1" 156 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 157 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 158 | 159 | cache-base@^1.0.1: 160 | version "1.0.1" 161 | resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 162 | integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== 163 | dependencies: 164 | collection-visit "^1.0.0" 165 | component-emitter "^1.2.1" 166 | get-value "^2.0.6" 167 | has-value "^1.0.0" 168 | isobject "^3.0.1" 169 | set-value "^2.0.0" 170 | to-object-path "^0.3.0" 171 | union-value "^1.0.0" 172 | unset-value "^1.0.0" 173 | 174 | camelcase@^4.1.0: 175 | version "4.1.0" 176 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 177 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 178 | 179 | chalk@^1.1.3: 180 | version "1.1.3" 181 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 182 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 183 | dependencies: 184 | ansi-styles "^2.2.1" 185 | escape-string-regexp "^1.0.2" 186 | has-ansi "^2.0.0" 187 | strip-ansi "^3.0.0" 188 | supports-color "^2.0.0" 189 | 190 | chalk@^2.1.0: 191 | version "2.4.1" 192 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 193 | integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== 194 | dependencies: 195 | ansi-styles "^3.2.1" 196 | escape-string-regexp "^1.0.5" 197 | supports-color "^5.3.0" 198 | 199 | chokidar-cli@~1.2.0: 200 | version "1.2.1" 201 | resolved "https://registry.yarnpkg.com/chokidar-cli/-/chokidar-cli-1.2.1.tgz#50574a63414174c5ac62f495abe09ae3cb6cb8b5" 202 | integrity sha512-JIrV9Z/pT7KjBWp9u+Uba0utdl2rmNaTj6t4ucaFseYDQASHZnWXy6vJIufDX+4FVh081gQZ2odrqorMfQhn7w== 203 | dependencies: 204 | bluebird "3.5.1" 205 | chokidar "2.0.4" 206 | lodash "4.17.10" 207 | yargs "12.0.1" 208 | 209 | chokidar@2.0.4: 210 | version "2.0.4" 211 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" 212 | integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== 213 | dependencies: 214 | anymatch "^2.0.0" 215 | async-each "^1.0.0" 216 | braces "^2.3.0" 217 | glob-parent "^3.1.0" 218 | inherits "^2.0.1" 219 | is-binary-path "^1.0.0" 220 | is-glob "^4.0.0" 221 | lodash.debounce "^4.0.8" 222 | normalize-path "^2.1.1" 223 | path-is-absolute "^1.0.0" 224 | readdirp "^2.0.0" 225 | upath "^1.0.5" 226 | optionalDependencies: 227 | fsevents "^1.2.2" 228 | 229 | chownr@^1.1.1: 230 | version "1.1.1" 231 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" 232 | integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== 233 | 234 | class-utils@^0.3.5: 235 | version "0.3.6" 236 | resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" 237 | integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== 238 | dependencies: 239 | arr-union "^3.1.0" 240 | define-property "^0.2.5" 241 | isobject "^3.0.0" 242 | static-extend "^0.1.1" 243 | 244 | cliui@^4.0.0: 245 | version "4.1.0" 246 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" 247 | integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== 248 | dependencies: 249 | string-width "^2.1.1" 250 | strip-ansi "^4.0.0" 251 | wrap-ansi "^2.0.0" 252 | 253 | code-point-at@^1.0.0: 254 | version "1.1.0" 255 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 256 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 257 | 258 | collection-visit@^1.0.0: 259 | version "1.0.0" 260 | resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" 261 | integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= 262 | dependencies: 263 | map-visit "^1.0.0" 264 | object-visit "^1.0.0" 265 | 266 | color-convert@^1.9.0: 267 | version "1.9.3" 268 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 269 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 270 | dependencies: 271 | color-name "1.1.3" 272 | 273 | color-name@1.1.3: 274 | version "1.1.3" 275 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 276 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 277 | 278 | commander@^2.9.0: 279 | version "2.19.0" 280 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 281 | integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== 282 | 283 | component-emitter@^1.2.1: 284 | version "1.2.1" 285 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 286 | integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= 287 | 288 | concat-map@0.0.1: 289 | version "0.0.1" 290 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 291 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 292 | 293 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 294 | version "1.1.0" 295 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 296 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 297 | 298 | copy-descriptor@^0.1.0: 299 | version "0.1.1" 300 | resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 301 | integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 302 | 303 | core-util-is@~1.0.0: 304 | version "1.0.2" 305 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 306 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 307 | 308 | cross-spawn@^5.0.1: 309 | version "5.1.0" 310 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 311 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 312 | dependencies: 313 | lru-cache "^4.0.1" 314 | shebang-command "^1.2.0" 315 | which "^1.2.9" 316 | 317 | debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: 318 | version "2.6.9" 319 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 320 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 321 | dependencies: 322 | ms "2.0.0" 323 | 324 | decamelize@^2.0.0: 325 | version "2.0.0" 326 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" 327 | integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== 328 | dependencies: 329 | xregexp "4.0.0" 330 | 331 | decode-uri-component@^0.2.0: 332 | version "0.2.0" 333 | resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" 334 | integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= 335 | 336 | deep-extend@^0.6.0: 337 | version "0.6.0" 338 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 339 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 340 | 341 | define-property@^0.2.5: 342 | version "0.2.5" 343 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" 344 | integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= 345 | dependencies: 346 | is-descriptor "^0.1.0" 347 | 348 | define-property@^1.0.0: 349 | version "1.0.0" 350 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 351 | integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= 352 | dependencies: 353 | is-descriptor "^1.0.0" 354 | 355 | define-property@^2.0.2: 356 | version "2.0.2" 357 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" 358 | integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== 359 | dependencies: 360 | is-descriptor "^1.0.2" 361 | isobject "^3.0.1" 362 | 363 | delegates@^1.0.0: 364 | version "1.0.0" 365 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 366 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 367 | 368 | detect-libc@^1.0.2: 369 | version "1.0.3" 370 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 371 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 372 | 373 | diff@^3.2.0: 374 | version "3.5.0" 375 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 376 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 377 | 378 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 379 | version "1.0.5" 380 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 381 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 382 | 383 | esutils@^2.0.2: 384 | version "2.0.2" 385 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 386 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 387 | 388 | execa@^0.7.0: 389 | version "0.7.0" 390 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 391 | integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 392 | dependencies: 393 | cross-spawn "^5.0.1" 394 | get-stream "^3.0.0" 395 | is-stream "^1.1.0" 396 | npm-run-path "^2.0.0" 397 | p-finally "^1.0.0" 398 | signal-exit "^3.0.0" 399 | strip-eof "^1.0.0" 400 | 401 | expand-brackets@^2.1.4: 402 | version "2.1.4" 403 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" 404 | integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= 405 | dependencies: 406 | debug "^2.3.3" 407 | define-property "^0.2.5" 408 | extend-shallow "^2.0.1" 409 | posix-character-classes "^0.1.0" 410 | regex-not "^1.0.0" 411 | snapdragon "^0.8.1" 412 | to-regex "^3.0.1" 413 | 414 | extend-shallow@^2.0.1: 415 | version "2.0.1" 416 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 417 | integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= 418 | dependencies: 419 | is-extendable "^0.1.0" 420 | 421 | extend-shallow@^3.0.0, extend-shallow@^3.0.2: 422 | version "3.0.2" 423 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" 424 | integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= 425 | dependencies: 426 | assign-symbols "^1.0.0" 427 | is-extendable "^1.0.1" 428 | 429 | extglob@^2.0.4: 430 | version "2.0.4" 431 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" 432 | integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== 433 | dependencies: 434 | array-unique "^0.3.2" 435 | define-property "^1.0.0" 436 | expand-brackets "^2.1.4" 437 | extend-shallow "^2.0.1" 438 | fragment-cache "^0.2.1" 439 | regex-not "^1.0.0" 440 | snapdragon "^0.8.1" 441 | to-regex "^3.0.1" 442 | 443 | fill-range@^4.0.0: 444 | version "4.0.0" 445 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" 446 | integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= 447 | dependencies: 448 | extend-shallow "^2.0.1" 449 | is-number "^3.0.0" 450 | repeat-string "^1.6.1" 451 | to-regex-range "^2.1.0" 452 | 453 | find-up@^3.0.0: 454 | version "3.0.0" 455 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 456 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 457 | dependencies: 458 | locate-path "^3.0.0" 459 | 460 | for-in@^1.0.2: 461 | version "1.0.2" 462 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 463 | integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= 464 | 465 | fragment-cache@^0.2.1: 466 | version "0.2.1" 467 | resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" 468 | integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= 469 | dependencies: 470 | map-cache "^0.2.2" 471 | 472 | fs-minipass@^1.2.5: 473 | version "1.2.5" 474 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" 475 | integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== 476 | dependencies: 477 | minipass "^2.2.1" 478 | 479 | fs.realpath@^1.0.0: 480 | version "1.0.0" 481 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 482 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 483 | 484 | fsevents@^1.2.2: 485 | version "1.2.4" 486 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" 487 | integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== 488 | dependencies: 489 | nan "^2.9.2" 490 | node-pre-gyp "^0.10.0" 491 | 492 | gauge@~2.7.3: 493 | version "2.7.4" 494 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 495 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 496 | dependencies: 497 | aproba "^1.0.3" 498 | console-control-strings "^1.0.0" 499 | has-unicode "^2.0.0" 500 | object-assign "^4.1.0" 501 | signal-exit "^3.0.0" 502 | string-width "^1.0.1" 503 | strip-ansi "^3.0.1" 504 | wide-align "^1.1.0" 505 | 506 | get-caller-file@^1.0.1: 507 | version "1.0.3" 508 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" 509 | integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== 510 | 511 | get-stream@^3.0.0: 512 | version "3.0.0" 513 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 514 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 515 | 516 | get-value@^2.0.3, get-value@^2.0.6: 517 | version "2.0.6" 518 | resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" 519 | integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= 520 | 521 | glob-parent@^3.1.0: 522 | version "3.1.0" 523 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" 524 | integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= 525 | dependencies: 526 | is-glob "^3.1.0" 527 | path-dirname "^1.0.0" 528 | 529 | glob@^7.0.5, glob@^7.1.1: 530 | version "7.1.3" 531 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 532 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 533 | dependencies: 534 | fs.realpath "^1.0.0" 535 | inflight "^1.0.4" 536 | inherits "2" 537 | minimatch "^3.0.4" 538 | once "^1.3.0" 539 | path-is-absolute "^1.0.0" 540 | 541 | graceful-fs@^4.1.11: 542 | version "4.1.15" 543 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 544 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 545 | 546 | has-ansi@^2.0.0: 547 | version "2.0.0" 548 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 549 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 550 | dependencies: 551 | ansi-regex "^2.0.0" 552 | 553 | has-flag@^3.0.0: 554 | version "3.0.0" 555 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 556 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 557 | 558 | has-unicode@^2.0.0: 559 | version "2.0.1" 560 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 561 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 562 | 563 | has-value@^0.3.1: 564 | version "0.3.1" 565 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" 566 | integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= 567 | dependencies: 568 | get-value "^2.0.3" 569 | has-values "^0.1.4" 570 | isobject "^2.0.0" 571 | 572 | has-value@^1.0.0: 573 | version "1.0.0" 574 | resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" 575 | integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= 576 | dependencies: 577 | get-value "^2.0.6" 578 | has-values "^1.0.0" 579 | isobject "^3.0.0" 580 | 581 | has-values@^0.1.4: 582 | version "0.1.4" 583 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" 584 | integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= 585 | 586 | has-values@^1.0.0: 587 | version "1.0.0" 588 | resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" 589 | integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= 590 | dependencies: 591 | is-number "^3.0.0" 592 | kind-of "^4.0.0" 593 | 594 | iconv-lite@^0.4.4: 595 | version "0.4.24" 596 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 597 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 598 | dependencies: 599 | safer-buffer ">= 2.1.2 < 3" 600 | 601 | ignore-walk@^3.0.1: 602 | version "3.0.1" 603 | resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" 604 | integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== 605 | dependencies: 606 | minimatch "^3.0.4" 607 | 608 | inflight@^1.0.4: 609 | version "1.0.6" 610 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 611 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 612 | dependencies: 613 | once "^1.3.0" 614 | wrappy "1" 615 | 616 | inherits@2, inherits@^2.0.1, inherits@~2.0.3: 617 | version "2.0.3" 618 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 619 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 620 | 621 | ini@~1.3.0: 622 | version "1.3.5" 623 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 624 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 625 | 626 | invert-kv@^1.0.0: 627 | version "1.0.0" 628 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 629 | integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= 630 | 631 | is-accessor-descriptor@^0.1.6: 632 | version "0.1.6" 633 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" 634 | integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= 635 | dependencies: 636 | kind-of "^3.0.2" 637 | 638 | is-accessor-descriptor@^1.0.0: 639 | version "1.0.0" 640 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" 641 | integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== 642 | dependencies: 643 | kind-of "^6.0.0" 644 | 645 | is-binary-path@^1.0.0: 646 | version "1.0.1" 647 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 648 | integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= 649 | dependencies: 650 | binary-extensions "^1.0.0" 651 | 652 | is-buffer@^1.1.5: 653 | version "1.1.6" 654 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 655 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 656 | 657 | is-data-descriptor@^0.1.4: 658 | version "0.1.4" 659 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" 660 | integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= 661 | dependencies: 662 | kind-of "^3.0.2" 663 | 664 | is-data-descriptor@^1.0.0: 665 | version "1.0.0" 666 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" 667 | integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== 668 | dependencies: 669 | kind-of "^6.0.0" 670 | 671 | is-descriptor@^0.1.0: 672 | version "0.1.6" 673 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" 674 | integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== 675 | dependencies: 676 | is-accessor-descriptor "^0.1.6" 677 | is-data-descriptor "^0.1.4" 678 | kind-of "^5.0.0" 679 | 680 | is-descriptor@^1.0.0, is-descriptor@^1.0.2: 681 | version "1.0.2" 682 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" 683 | integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== 684 | dependencies: 685 | is-accessor-descriptor "^1.0.0" 686 | is-data-descriptor "^1.0.0" 687 | kind-of "^6.0.2" 688 | 689 | is-extendable@^0.1.0, is-extendable@^0.1.1: 690 | version "0.1.1" 691 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 692 | integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= 693 | 694 | is-extendable@^1.0.1: 695 | version "1.0.1" 696 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 697 | integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== 698 | dependencies: 699 | is-plain-object "^2.0.4" 700 | 701 | is-extglob@^2.1.0, is-extglob@^2.1.1: 702 | version "2.1.1" 703 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 704 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 705 | 706 | is-fullwidth-code-point@^1.0.0: 707 | version "1.0.0" 708 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 709 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 710 | dependencies: 711 | number-is-nan "^1.0.0" 712 | 713 | is-fullwidth-code-point@^2.0.0: 714 | version "2.0.0" 715 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 716 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 717 | 718 | is-glob@^3.1.0: 719 | version "3.1.0" 720 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 721 | integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= 722 | dependencies: 723 | is-extglob "^2.1.0" 724 | 725 | is-glob@^4.0.0: 726 | version "4.0.0" 727 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" 728 | integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= 729 | dependencies: 730 | is-extglob "^2.1.1" 731 | 732 | is-number@^3.0.0: 733 | version "3.0.0" 734 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 735 | integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= 736 | dependencies: 737 | kind-of "^3.0.2" 738 | 739 | is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 740 | version "2.0.4" 741 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 742 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 743 | dependencies: 744 | isobject "^3.0.1" 745 | 746 | is-stream@^1.1.0: 747 | version "1.1.0" 748 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 749 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 750 | 751 | is-windows@^1.0.2: 752 | version "1.0.2" 753 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 754 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 755 | 756 | isarray@1.0.0, isarray@~1.0.0: 757 | version "1.0.0" 758 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 759 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 760 | 761 | isexe@^2.0.0: 762 | version "2.0.0" 763 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 764 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 765 | 766 | isobject@^2.0.0: 767 | version "2.1.0" 768 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 769 | integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= 770 | dependencies: 771 | isarray "1.0.0" 772 | 773 | isobject@^3.0.0, isobject@^3.0.1: 774 | version "3.0.1" 775 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 776 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 777 | 778 | js-tokens@^3.0.2: 779 | version "3.0.2" 780 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 781 | integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 782 | 783 | kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: 784 | version "3.2.2" 785 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 786 | integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= 787 | dependencies: 788 | is-buffer "^1.1.5" 789 | 790 | kind-of@^4.0.0: 791 | version "4.0.0" 792 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 793 | integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= 794 | dependencies: 795 | is-buffer "^1.1.5" 796 | 797 | kind-of@^5.0.0: 798 | version "5.1.0" 799 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" 800 | integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== 801 | 802 | kind-of@^6.0.0, kind-of@^6.0.2: 803 | version "6.0.2" 804 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 805 | integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== 806 | 807 | lcid@^1.0.0: 808 | version "1.0.0" 809 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 810 | integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= 811 | dependencies: 812 | invert-kv "^1.0.0" 813 | 814 | locate-path@^3.0.0: 815 | version "3.0.0" 816 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 817 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 818 | dependencies: 819 | p-locate "^3.0.0" 820 | path-exists "^3.0.0" 821 | 822 | lodash.debounce@^4.0.8: 823 | version "4.0.8" 824 | resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 825 | integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= 826 | 827 | lodash@4.17.10: 828 | version "4.17.10" 829 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" 830 | integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== 831 | 832 | lru-cache@^4.0.1: 833 | version "4.1.4" 834 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.4.tgz#51cc46e8e6d9530771c857e24ccc720ecdbcc031" 835 | integrity sha512-EPstzZ23znHUVLKj+lcXO1KvZkrlw+ZirdwvOmnAnA/1PB4ggyXJ77LRkCqkff+ShQ+cqoxCxLQOh4cKITO5iA== 836 | dependencies: 837 | pseudomap "^1.0.2" 838 | yallist "^3.0.2" 839 | 840 | map-cache@^0.2.2: 841 | version "0.2.2" 842 | resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" 843 | integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= 844 | 845 | map-visit@^1.0.0: 846 | version "1.0.0" 847 | resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" 848 | integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= 849 | dependencies: 850 | object-visit "^1.0.0" 851 | 852 | mem@^1.1.0: 853 | version "1.1.0" 854 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 855 | integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= 856 | dependencies: 857 | mimic-fn "^1.0.0" 858 | 859 | micromatch@^3.1.10, micromatch@^3.1.4: 860 | version "3.1.10" 861 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" 862 | integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== 863 | dependencies: 864 | arr-diff "^4.0.0" 865 | array-unique "^0.3.2" 866 | braces "^2.3.1" 867 | define-property "^2.0.2" 868 | extend-shallow "^3.0.2" 869 | extglob "^2.0.4" 870 | fragment-cache "^0.2.1" 871 | kind-of "^6.0.2" 872 | nanomatch "^1.2.9" 873 | object.pick "^1.3.0" 874 | regex-not "^1.0.0" 875 | snapdragon "^0.8.1" 876 | to-regex "^3.0.2" 877 | 878 | mimic-fn@^1.0.0: 879 | version "1.2.0" 880 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 881 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 882 | 883 | minimatch@^3.0.4: 884 | version "3.0.4" 885 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 886 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 887 | dependencies: 888 | brace-expansion "^1.1.7" 889 | 890 | minimist@0.0.8: 891 | version "0.0.8" 892 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 893 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 894 | 895 | minimist@^1.2.0: 896 | version "1.2.0" 897 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 898 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= 899 | 900 | minipass@^2.2.1, minipass@^2.3.4: 901 | version "2.3.5" 902 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" 903 | integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== 904 | dependencies: 905 | safe-buffer "^5.1.2" 906 | yallist "^3.0.0" 907 | 908 | minizlib@^1.1.1: 909 | version "1.1.1" 910 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42" 911 | integrity sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg== 912 | dependencies: 913 | minipass "^2.2.1" 914 | 915 | mixin-deep@^1.2.0: 916 | version "1.3.1" 917 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" 918 | integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== 919 | dependencies: 920 | for-in "^1.0.2" 921 | is-extendable "^1.0.1" 922 | 923 | mkdirp@^0.5.0, mkdirp@^0.5.1: 924 | version "0.5.1" 925 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 926 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 927 | dependencies: 928 | minimist "0.0.8" 929 | 930 | ms@2.0.0: 931 | version "2.0.0" 932 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 933 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 934 | 935 | nan@^2.9.2: 936 | version "2.11.1" 937 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" 938 | integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== 939 | 940 | nanomatch@^1.2.9: 941 | version "1.2.13" 942 | resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" 943 | integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== 944 | dependencies: 945 | arr-diff "^4.0.0" 946 | array-unique "^0.3.2" 947 | define-property "^2.0.2" 948 | extend-shallow "^3.0.2" 949 | fragment-cache "^0.2.1" 950 | is-windows "^1.0.2" 951 | kind-of "^6.0.2" 952 | object.pick "^1.3.0" 953 | regex-not "^1.0.0" 954 | snapdragon "^0.8.1" 955 | to-regex "^3.0.1" 956 | 957 | needle@^2.2.1: 958 | version "2.2.4" 959 | resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" 960 | integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== 961 | dependencies: 962 | debug "^2.1.2" 963 | iconv-lite "^0.4.4" 964 | sax "^1.2.4" 965 | 966 | node-pre-gyp@^0.10.0: 967 | version "0.10.3" 968 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" 969 | integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== 970 | dependencies: 971 | detect-libc "^1.0.2" 972 | mkdirp "^0.5.1" 973 | needle "^2.2.1" 974 | nopt "^4.0.1" 975 | npm-packlist "^1.1.6" 976 | npmlog "^4.0.2" 977 | rc "^1.2.7" 978 | rimraf "^2.6.1" 979 | semver "^5.3.0" 980 | tar "^4" 981 | 982 | nopt@^4.0.1: 983 | version "4.0.1" 984 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 985 | integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= 986 | dependencies: 987 | abbrev "1" 988 | osenv "^0.1.4" 989 | 990 | normalize-path@^2.1.1: 991 | version "2.1.1" 992 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 993 | integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= 994 | dependencies: 995 | remove-trailing-separator "^1.0.1" 996 | 997 | npm-bundled@^1.0.1: 998 | version "1.0.5" 999 | resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" 1000 | integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== 1001 | 1002 | npm-packlist@^1.1.6: 1003 | version "1.1.12" 1004 | resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" 1005 | integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== 1006 | dependencies: 1007 | ignore-walk "^3.0.1" 1008 | npm-bundled "^1.0.1" 1009 | 1010 | npm-run-path@^2.0.0: 1011 | version "2.0.2" 1012 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1013 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1014 | dependencies: 1015 | path-key "^2.0.0" 1016 | 1017 | npmlog@^4.0.2: 1018 | version "4.1.2" 1019 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1020 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1021 | dependencies: 1022 | are-we-there-yet "~1.1.2" 1023 | console-control-strings "~1.1.0" 1024 | gauge "~2.7.3" 1025 | set-blocking "~2.0.0" 1026 | 1027 | number-is-nan@^1.0.0: 1028 | version "1.0.1" 1029 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1030 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1031 | 1032 | object-assign@^4.1.0: 1033 | version "4.1.1" 1034 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1035 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1036 | 1037 | object-copy@^0.1.0: 1038 | version "0.1.0" 1039 | resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" 1040 | integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= 1041 | dependencies: 1042 | copy-descriptor "^0.1.0" 1043 | define-property "^0.2.5" 1044 | kind-of "^3.0.3" 1045 | 1046 | object-visit@^1.0.0: 1047 | version "1.0.1" 1048 | resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" 1049 | integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= 1050 | dependencies: 1051 | isobject "^3.0.0" 1052 | 1053 | object.pick@^1.3.0: 1054 | version "1.3.0" 1055 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 1056 | integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= 1057 | dependencies: 1058 | isobject "^3.0.1" 1059 | 1060 | once@^1.3.0: 1061 | version "1.4.0" 1062 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1063 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1064 | dependencies: 1065 | wrappy "1" 1066 | 1067 | os-homedir@^1.0.0: 1068 | version "1.0.2" 1069 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1070 | integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= 1071 | 1072 | os-locale@^2.0.0: 1073 | version "2.1.0" 1074 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" 1075 | integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== 1076 | dependencies: 1077 | execa "^0.7.0" 1078 | lcid "^1.0.0" 1079 | mem "^1.1.0" 1080 | 1081 | os-tmpdir@^1.0.0: 1082 | version "1.0.2" 1083 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1084 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1085 | 1086 | osenv@^0.1.4: 1087 | version "0.1.5" 1088 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" 1089 | integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== 1090 | dependencies: 1091 | os-homedir "^1.0.0" 1092 | os-tmpdir "^1.0.0" 1093 | 1094 | p-finally@^1.0.0: 1095 | version "1.0.0" 1096 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1097 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1098 | 1099 | p-limit@^2.0.0: 1100 | version "2.0.0" 1101 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" 1102 | integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== 1103 | dependencies: 1104 | p-try "^2.0.0" 1105 | 1106 | p-locate@^3.0.0: 1107 | version "3.0.0" 1108 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1109 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1110 | dependencies: 1111 | p-limit "^2.0.0" 1112 | 1113 | p-try@^2.0.0: 1114 | version "2.0.0" 1115 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" 1116 | integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== 1117 | 1118 | pascalcase@^0.1.1: 1119 | version "0.1.1" 1120 | resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" 1121 | integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= 1122 | 1123 | path-dirname@^1.0.0: 1124 | version "1.0.2" 1125 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 1126 | integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= 1127 | 1128 | path-exists@^3.0.0: 1129 | version "3.0.0" 1130 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1131 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1132 | 1133 | path-is-absolute@^1.0.0: 1134 | version "1.0.1" 1135 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1136 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1137 | 1138 | path-key@^2.0.0: 1139 | version "2.0.1" 1140 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1141 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1142 | 1143 | path-parse@^1.0.5: 1144 | version "1.0.6" 1145 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1146 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 1147 | 1148 | posix-character-classes@^0.1.0: 1149 | version "0.1.1" 1150 | resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 1151 | integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 1152 | 1153 | process-nextick-args@~2.0.0: 1154 | version "2.0.0" 1155 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 1156 | integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== 1157 | 1158 | pseudomap@^1.0.2: 1159 | version "1.0.2" 1160 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1161 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1162 | 1163 | rc@^1.2.7: 1164 | version "1.2.8" 1165 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1166 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1167 | dependencies: 1168 | deep-extend "^0.6.0" 1169 | ini "~1.3.0" 1170 | minimist "^1.2.0" 1171 | strip-json-comments "~2.0.1" 1172 | 1173 | readable-stream@^2.0.2, readable-stream@^2.0.6: 1174 | version "2.3.6" 1175 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 1176 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 1177 | dependencies: 1178 | core-util-is "~1.0.0" 1179 | inherits "~2.0.3" 1180 | isarray "~1.0.0" 1181 | process-nextick-args "~2.0.0" 1182 | safe-buffer "~5.1.1" 1183 | string_decoder "~1.1.1" 1184 | util-deprecate "~1.0.1" 1185 | 1186 | readdirp@^2.0.0: 1187 | version "2.2.1" 1188 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" 1189 | integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== 1190 | dependencies: 1191 | graceful-fs "^4.1.11" 1192 | micromatch "^3.1.10" 1193 | readable-stream "^2.0.2" 1194 | 1195 | regex-not@^1.0.0, regex-not@^1.0.2: 1196 | version "1.0.2" 1197 | resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" 1198 | integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== 1199 | dependencies: 1200 | extend-shallow "^3.0.2" 1201 | safe-regex "^1.1.0" 1202 | 1203 | remove-trailing-separator@^1.0.1: 1204 | version "1.1.0" 1205 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1206 | integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= 1207 | 1208 | repeat-element@^1.1.2: 1209 | version "1.1.3" 1210 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 1211 | integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== 1212 | 1213 | repeat-string@^1.6.1: 1214 | version "1.6.1" 1215 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1216 | integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= 1217 | 1218 | require-directory@^2.1.1: 1219 | version "2.1.1" 1220 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1221 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1222 | 1223 | require-main-filename@^1.0.1: 1224 | version "1.0.1" 1225 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1226 | integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= 1227 | 1228 | resolve-url@^0.2.1: 1229 | version "0.2.1" 1230 | resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 1231 | integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 1232 | 1233 | resolve@^1.3.2: 1234 | version "1.8.1" 1235 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 1236 | integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== 1237 | dependencies: 1238 | path-parse "^1.0.5" 1239 | 1240 | ret@~0.1.10: 1241 | version "0.1.15" 1242 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 1243 | integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== 1244 | 1245 | rimraf@^2.6.1: 1246 | version "2.6.2" 1247 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1248 | integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== 1249 | dependencies: 1250 | glob "^7.0.5" 1251 | 1252 | safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1253 | version "5.1.2" 1254 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1255 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1256 | 1257 | safe-regex@^1.1.0: 1258 | version "1.1.0" 1259 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 1260 | integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= 1261 | dependencies: 1262 | ret "~0.1.10" 1263 | 1264 | "safer-buffer@>= 2.1.2 < 3": 1265 | version "2.1.2" 1266 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1267 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1268 | 1269 | sax@^1.2.4: 1270 | version "1.2.4" 1271 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1272 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1273 | 1274 | semver@^5.3.0: 1275 | version "5.6.0" 1276 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 1277 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 1278 | 1279 | set-blocking@^2.0.0, set-blocking@~2.0.0: 1280 | version "2.0.0" 1281 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1282 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1283 | 1284 | set-value@^0.4.3: 1285 | version "0.4.3" 1286 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" 1287 | integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= 1288 | dependencies: 1289 | extend-shallow "^2.0.1" 1290 | is-extendable "^0.1.1" 1291 | is-plain-object "^2.0.1" 1292 | to-object-path "^0.3.0" 1293 | 1294 | set-value@^2.0.0: 1295 | version "2.0.0" 1296 | resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" 1297 | integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== 1298 | dependencies: 1299 | extend-shallow "^2.0.1" 1300 | is-extendable "^0.1.1" 1301 | is-plain-object "^2.0.3" 1302 | split-string "^3.0.1" 1303 | 1304 | shebang-command@^1.2.0: 1305 | version "1.2.0" 1306 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1307 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1308 | dependencies: 1309 | shebang-regex "^1.0.0" 1310 | 1311 | shebang-regex@^1.0.0: 1312 | version "1.0.0" 1313 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1314 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1315 | 1316 | signal-exit@^3.0.0: 1317 | version "3.0.2" 1318 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1319 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1320 | 1321 | snapdragon-node@^2.0.1: 1322 | version "2.1.1" 1323 | resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" 1324 | integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== 1325 | dependencies: 1326 | define-property "^1.0.0" 1327 | isobject "^3.0.0" 1328 | snapdragon-util "^3.0.1" 1329 | 1330 | snapdragon-util@^3.0.1: 1331 | version "3.0.1" 1332 | resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" 1333 | integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== 1334 | dependencies: 1335 | kind-of "^3.2.0" 1336 | 1337 | snapdragon@^0.8.1: 1338 | version "0.8.2" 1339 | resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" 1340 | integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== 1341 | dependencies: 1342 | base "^0.11.1" 1343 | debug "^2.2.0" 1344 | define-property "^0.2.5" 1345 | extend-shallow "^2.0.1" 1346 | map-cache "^0.2.2" 1347 | source-map "^0.5.6" 1348 | source-map-resolve "^0.5.0" 1349 | use "^3.1.0" 1350 | 1351 | source-map-resolve@^0.5.0: 1352 | version "0.5.2" 1353 | resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" 1354 | integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== 1355 | dependencies: 1356 | atob "^2.1.1" 1357 | decode-uri-component "^0.2.0" 1358 | resolve-url "^0.2.1" 1359 | source-map-url "^0.4.0" 1360 | urix "^0.1.0" 1361 | 1362 | source-map-url@^0.4.0: 1363 | version "0.4.0" 1364 | resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 1365 | integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= 1366 | 1367 | source-map@^0.5.6: 1368 | version "0.5.7" 1369 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1370 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1371 | 1372 | split-string@^3.0.1, split-string@^3.0.2: 1373 | version "3.1.0" 1374 | resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" 1375 | integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== 1376 | dependencies: 1377 | extend-shallow "^3.0.0" 1378 | 1379 | static-extend@^0.1.1: 1380 | version "0.1.2" 1381 | resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" 1382 | integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= 1383 | dependencies: 1384 | define-property "^0.2.5" 1385 | object-copy "^0.1.0" 1386 | 1387 | string-width@^1.0.1: 1388 | version "1.0.2" 1389 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1390 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1391 | dependencies: 1392 | code-point-at "^1.0.0" 1393 | is-fullwidth-code-point "^1.0.0" 1394 | strip-ansi "^3.0.0" 1395 | 1396 | "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: 1397 | version "2.1.1" 1398 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1399 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1400 | dependencies: 1401 | is-fullwidth-code-point "^2.0.0" 1402 | strip-ansi "^4.0.0" 1403 | 1404 | string_decoder@~1.1.1: 1405 | version "1.1.1" 1406 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1407 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1408 | dependencies: 1409 | safe-buffer "~5.1.0" 1410 | 1411 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1412 | version "3.0.1" 1413 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1414 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1415 | dependencies: 1416 | ansi-regex "^2.0.0" 1417 | 1418 | strip-ansi@^4.0.0: 1419 | version "4.0.0" 1420 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1421 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1422 | dependencies: 1423 | ansi-regex "^3.0.0" 1424 | 1425 | strip-eof@^1.0.0: 1426 | version "1.0.0" 1427 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1428 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 1429 | 1430 | strip-json-comments@~2.0.1: 1431 | version "2.0.1" 1432 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1433 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1434 | 1435 | supports-color@^2.0.0: 1436 | version "2.0.0" 1437 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1438 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 1439 | 1440 | supports-color@^5.3.0: 1441 | version "5.5.0" 1442 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1443 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1444 | dependencies: 1445 | has-flag "^3.0.0" 1446 | 1447 | tar@^4: 1448 | version "4.4.8" 1449 | resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" 1450 | integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== 1451 | dependencies: 1452 | chownr "^1.1.1" 1453 | fs-minipass "^1.2.5" 1454 | minipass "^2.3.4" 1455 | minizlib "^1.1.1" 1456 | mkdirp "^0.5.0" 1457 | safe-buffer "^5.1.2" 1458 | yallist "^3.0.2" 1459 | 1460 | to-object-path@^0.3.0: 1461 | version "0.3.0" 1462 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 1463 | integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= 1464 | dependencies: 1465 | kind-of "^3.0.2" 1466 | 1467 | to-regex-range@^2.1.0: 1468 | version "2.1.1" 1469 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" 1470 | integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= 1471 | dependencies: 1472 | is-number "^3.0.0" 1473 | repeat-string "^1.6.1" 1474 | 1475 | to-regex@^3.0.1, to-regex@^3.0.2: 1476 | version "3.0.2" 1477 | resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" 1478 | integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== 1479 | dependencies: 1480 | define-property "^2.0.2" 1481 | extend-shallow "^3.0.2" 1482 | regex-not "^1.0.2" 1483 | safe-regex "^1.1.0" 1484 | 1485 | tslib@^1.7.1, tslib@^1.8.1: 1486 | version "1.9.3" 1487 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 1488 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 1489 | 1490 | tslint@~5.8.0: 1491 | version "5.8.0" 1492 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.8.0.tgz#1f49ad5b2e77c76c3af4ddcae552ae4e3612eb13" 1493 | integrity sha1-H0mtWy53x2w69N3K5VKuTjYS6xM= 1494 | dependencies: 1495 | babel-code-frame "^6.22.0" 1496 | builtin-modules "^1.1.1" 1497 | chalk "^2.1.0" 1498 | commander "^2.9.0" 1499 | diff "^3.2.0" 1500 | glob "^7.1.1" 1501 | minimatch "^3.0.4" 1502 | resolve "^1.3.2" 1503 | semver "^5.3.0" 1504 | tslib "^1.7.1" 1505 | tsutils "^2.12.1" 1506 | 1507 | tsutils@^2.12.1: 1508 | version "2.29.0" 1509 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 1510 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 1511 | dependencies: 1512 | tslib "^1.8.1" 1513 | 1514 | typescript@~2.5.3: 1515 | version "2.5.3" 1516 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.5.3.tgz#df3dcdc38f3beb800d4bc322646b04a3f6ca7f0d" 1517 | integrity sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w== 1518 | 1519 | union-value@^1.0.0: 1520 | version "1.0.0" 1521 | resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" 1522 | integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= 1523 | dependencies: 1524 | arr-union "^3.1.0" 1525 | get-value "^2.0.6" 1526 | is-extendable "^0.1.1" 1527 | set-value "^0.4.3" 1528 | 1529 | unset-value@^1.0.0: 1530 | version "1.0.0" 1531 | resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" 1532 | integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= 1533 | dependencies: 1534 | has-value "^0.3.1" 1535 | isobject "^3.0.0" 1536 | 1537 | upath@^1.0.5: 1538 | version "1.1.0" 1539 | resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" 1540 | integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== 1541 | 1542 | urix@^0.1.0: 1543 | version "0.1.0" 1544 | resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" 1545 | integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= 1546 | 1547 | use@^3.1.0: 1548 | version "3.1.1" 1549 | resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" 1550 | integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== 1551 | 1552 | util-deprecate@~1.0.1: 1553 | version "1.0.2" 1554 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1555 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1556 | 1557 | which-module@^2.0.0: 1558 | version "2.0.0" 1559 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1560 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1561 | 1562 | which@^1.2.9: 1563 | version "1.3.1" 1564 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1565 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1566 | dependencies: 1567 | isexe "^2.0.0" 1568 | 1569 | wide-align@^1.1.0: 1570 | version "1.1.3" 1571 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1572 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1573 | dependencies: 1574 | string-width "^1.0.2 || 2" 1575 | 1576 | wrap-ansi@^2.0.0: 1577 | version "2.1.0" 1578 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1579 | integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= 1580 | dependencies: 1581 | string-width "^1.0.1" 1582 | strip-ansi "^3.0.1" 1583 | 1584 | wrappy@1: 1585 | version "1.0.2" 1586 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1587 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1588 | 1589 | xregexp@4.0.0: 1590 | version "4.0.0" 1591 | resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" 1592 | integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== 1593 | 1594 | "y18n@^3.2.1 || ^4.0.0": 1595 | version "4.0.0" 1596 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1597 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1598 | 1599 | yallist@^3.0.0, yallist@^3.0.2: 1600 | version "3.0.3" 1601 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" 1602 | integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== 1603 | 1604 | yargs-parser@^10.1.0: 1605 | version "10.1.0" 1606 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" 1607 | integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== 1608 | dependencies: 1609 | camelcase "^4.1.0" 1610 | 1611 | yargs@12.0.1: 1612 | version "12.0.1" 1613 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" 1614 | integrity sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ== 1615 | dependencies: 1616 | cliui "^4.0.0" 1617 | decamelize "^2.0.0" 1618 | find-up "^3.0.0" 1619 | get-caller-file "^1.0.1" 1620 | os-locale "^2.0.0" 1621 | require-directory "^2.1.1" 1622 | require-main-filename "^1.0.1" 1623 | set-blocking "^2.0.0" 1624 | string-width "^2.0.0" 1625 | which-module "^2.0.0" 1626 | y18n "^3.2.1 || ^4.0.0" 1627 | yargs-parser "^10.1.0" 1628 | --------------------------------------------------------------------------------