├── .editorconfig ├── .gitignore ├── README.md ├── index.js ├── lib └── rules │ ├── camelcase-deprecation-support.js │ ├── explicit-createref-type.js │ ├── react-import-style.js │ └── use-a11y-component.js ├── package.json ├── tests └── lib │ ├── index.js │ └── rules │ ├── camelcase-deprecation-support.js │ ├── explicit-createref-type.js │ ├── react-import-style.js │ └── use-a11y-component.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # http://editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | indent_style = space 9 | indent_size = 2 10 | end_of_line = lf 11 | charset = utf-8 12 | max_line_length = 120 13 | trim_trailing_whitespace = true 14 | insert_final_newline = true 15 | 16 | [{*.txt,*.md,*.mkdn,*.mdown,*.markdown}] 17 | max_line_length = 0 18 | trim_trailing_whitespace = false 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Usage 2 | 3 | * Use [AST Explorer](http://astexplorer.net/) to know what you're looking for 4 | * Run `yarn test` to make sure everything works 5 | * Update `index.js` to export the new rule name and any additional rules 6 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rules: { 3 | 'react-import-style': require('./lib/rules/react-import-style'), 4 | 'use-a11y-component': require('./lib/rules/use-a11y-component'), 5 | camelcase: require('./lib/rules/camelcase-deprecation-support'), 6 | 'explicit-createref-type': require('./lib/rules/explicit-createref-type'), 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /lib/rules/camelcase-deprecation-support.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview Rule to flag non-camelcased identifiers 3 | * @author Nicholas C. Zakas 4 | * 5 | * modified by Michael Greer 6 | */ 7 | 8 | 'use strict'; 9 | 10 | //------------------------------------------------------------------------------ 11 | // Rule Definition 12 | //------------------------------------------------------------------------------ 13 | 14 | module.exports = { 15 | meta: { 16 | docs: { 17 | description: 'enforce camelcase naming convention', 18 | category: 'Stylistic Issues', 19 | recommended: false, 20 | url: 'https://eslint.org/docs/rules/camelcase', 21 | }, 22 | 23 | schema: [ 24 | { 25 | type: 'object', 26 | properties: { 27 | properties: { 28 | enum: ['always', 'never'], 29 | }, 30 | }, 31 | additionalProperties: false, 32 | }, 33 | ], 34 | 35 | messages: { 36 | notCamelCase: "Identifier '{{name}}' is not in camel case.", 37 | }, 38 | }, 39 | 40 | create(context) { 41 | //-------------------------------------------------------------------------- 42 | // Helpers 43 | //-------------------------------------------------------------------------- 44 | 45 | // contains reported nodes to avoid reporting twice on destructuring with shorthand notation 46 | const reported = []; 47 | const ALLOWED_PARENT_TYPES = new Set(['CallExpression', 'NewExpression']); 48 | 49 | /** 50 | * Checks if a string contains an underscore and isn't all upper-case 51 | * @param {string} name The string to check. 52 | * @returns {boolean} if the string is underscored 53 | * @private 54 | */ 55 | function isUnderscored(name) { 56 | // skip UNSAFE_ beginning 57 | if (name.substring(0, 7) === 'UNSAFE_') { 58 | name = name.substring(7); 59 | } 60 | // if there's an underscore, it might be A_CONSTANT, which is okay 61 | return name.indexOf('_') > -1 && name !== name.toUpperCase(); 62 | } 63 | 64 | /** 65 | * Reports an AST node as a rule violation. 66 | * @param {ASTNode} node The node to report. 67 | * @returns {void} 68 | * @private 69 | */ 70 | function report(node) { 71 | if (reported.indexOf(node) < 0) { 72 | reported.push(node); 73 | context.report({node, messageId: 'notCamelCase', data: {name: node.name}}); 74 | } 75 | } 76 | 77 | const options = context.options[0] || {}; 78 | let properties = options.properties || ''; 79 | 80 | if (properties !== 'always' && properties !== 'never') { 81 | properties = 'always'; 82 | } 83 | 84 | return { 85 | Identifier(node) { 86 | /* 87 | * Leading and trailing underscores are commonly used to flag 88 | * private/protected identifiers, strip them 89 | */ 90 | const name = node.name.replace(/^_+|_+$/g, ''), 91 | effectiveParent = node.parent.type === 'MemberExpression' ? node.parent.parent : node.parent; 92 | 93 | // MemberExpressions get special rules 94 | if (node.parent.type === 'MemberExpression') { 95 | // "never" check properties 96 | if (properties === 'never') { 97 | return; 98 | } 99 | 100 | // Always report underscored object names 101 | if ( 102 | node.parent.object.type === 'Identifier' && 103 | node.parent.object.name === node.name && 104 | isUnderscored(name) 105 | ) { 106 | report(node); 107 | 108 | // Report AssignmentExpressions only if they are the left side of the assignment 109 | } else if ( 110 | effectiveParent.type === 'AssignmentExpression' && 111 | isUnderscored(name) && 112 | (effectiveParent.right.type !== 'MemberExpression' || 113 | (effectiveParent.left.type === 'MemberExpression' && effectiveParent.left.property.name === node.name)) 114 | ) { 115 | report(node); 116 | } 117 | 118 | /* 119 | * Properties have their own rules, and 120 | * AssignmentPattern nodes can be treated like Properties: 121 | * e.g.: const { no_camelcased = false } = bar; 122 | */ 123 | } else if (node.parent.type === 'Property' || node.parent.type === 'AssignmentPattern') { 124 | if (node.parent.parent && node.parent.parent.type === 'ObjectPattern') { 125 | if (node.parent.shorthand && node.parent.value.left && isUnderscored(name)) { 126 | report(node); 127 | } 128 | 129 | // prevent checking righthand side of destructured object 130 | if (node.parent.key === node && node.parent.value !== node) { 131 | return; 132 | } 133 | 134 | if (node.parent.value.name && isUnderscored(name)) { 135 | report(node); 136 | } 137 | } 138 | 139 | // "never" check properties 140 | if (properties === 'never') { 141 | return; 142 | } 143 | 144 | // don't check right hand side of AssignmentExpression to prevent duplicate warnings 145 | if (isUnderscored(name) && !ALLOWED_PARENT_TYPES.has(effectiveParent.type) && !(node.parent.right === node)) { 146 | report(node); 147 | } 148 | 149 | // Check if it's an import specifier 150 | } else if ( 151 | ['ImportSpecifier', 'ImportNamespaceSpecifier', 'ImportDefaultSpecifier'].indexOf(node.parent.type) >= 0 152 | ) { 153 | // Report only if the local imported identifier is underscored 154 | if (node.parent.local && node.parent.local.name === node.name && isUnderscored(name)) { 155 | report(node); 156 | } 157 | 158 | // Report anything that is underscored that isn't a CallExpression 159 | } else if (isUnderscored(name) && !ALLOWED_PARENT_TYPES.has(effectiveParent.type)) { 160 | report(node); 161 | } 162 | }, 163 | }; 164 | }, 165 | }; 166 | -------------------------------------------------------------------------------- /lib/rules/explicit-createref-type.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const explicitCreateRefTypeMessage = `React.createRef() class properties should be explicitly typed.`; 4 | 5 | module.exports = { 6 | meta: { 7 | messages: { 8 | explicitCreateRefTypeMessage 9 | }, 10 | docs: { 11 | description: "Force explicit type annotation on class properties storing a React.createRef()", 12 | category: "Best Practices" 13 | }, 14 | schema: [ 15 | { 16 | type: "object", 17 | properties: {}, 18 | additionalProperties: false 19 | } 20 | ] 21 | }, 22 | 23 | create: function(context) { 24 | return { 25 | ClassProperty: node => { 26 | if (node.typeAnnotation) { 27 | return; 28 | } 29 | 30 | const value = node.value; 31 | if (value != null && value.type === "CallExpression") { 32 | const callee = value.callee; 33 | const typeArguments = value.typeArguments; 34 | if ( 35 | callee.type === "MemberExpression" && 36 | callee.object.name === "React" && 37 | callee.property.name === "createRef" && 38 | typeArguments == null 39 | ) { 40 | context.report({ 41 | node, 42 | message: explicitCreateRefTypeMessage 43 | }); 44 | } 45 | } 46 | } 47 | }; 48 | } 49 | }; 50 | -------------------------------------------------------------------------------- /lib/rules/react-import-style.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const improperReactImport = `Import react in the following style: "import * as React from 'react';"`; 4 | 5 | /** 6 | * Returns the name of the module imported 7 | * 8 | * @param {ASTNode} node - A node to get. 9 | * @returns {string} the name of the module, or empty string if no name. 10 | */ 11 | function getValue(node) { 12 | if (node != null && node.source != null && node.source.value != null) { 13 | return node.source.value.trim(); 14 | } 15 | 16 | return ''; 17 | } 18 | 19 | module.exports = { 20 | meta: { 21 | messages: { 22 | improperReactImport, 23 | }, 24 | docs: { 25 | description: 'Force import * as React style', 26 | category: 'Best Practices', 27 | }, 28 | schema: [ 29 | { 30 | type: 'object', 31 | properties: {}, 32 | additionalProperties: false, 33 | }, 34 | ], 35 | }, 36 | 37 | create: function(context) { 38 | return { 39 | ImportDeclaration: node => { 40 | const value = getValue(node); 41 | 42 | if (value === 'react') { 43 | const text = context.getSourceCode().getText(node); 44 | if (text === `import React from 'react';`) { 45 | context.report({ 46 | node, 47 | message: improperReactImport, 48 | }); 49 | } 50 | } 51 | }, 52 | }; 53 | }, 54 | }; 55 | -------------------------------------------------------------------------------- /lib/rules/use-a11y-component.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const {hasProp, elementType} = require('jsx-ast-utils'); 4 | 5 | const useAnchorMessage = `Do not use HTML anchor () tags directly. Please use uikit/Anchor.`; 6 | const useClickableMessage = `Don't use onClick on non-button HTMLElement. Please use uikit/Clickable.`; 7 | 8 | module.exports = { 9 | meta: { 10 | messages: { 11 | useAnchorMessage, 12 | useClickableMessage, 13 | }, 14 | docs: { 15 | description: 'Custom a11y component enforcement', 16 | category: 'Accessibility', 17 | }, 18 | schema: [ 19 | { 20 | type: 'object', 21 | properties: {}, 22 | additionalProperties: false, 23 | }, 24 | ], 25 | }, 26 | 27 | create: function(context) { 28 | return { 29 | JSXOpeningElement: node => { 30 | const tag = elementType(node); 31 | 32 | if (tag === 'a') { 33 | // Don't use `a` use `Anchor` 34 | context.report({ 35 | node, 36 | message: useAnchorMessage, 37 | }); 38 | } else if (tag !== 'button' && /^[a-z]/.test(tag) && hasProp(node.attributes, 'onClick')) { 39 | // Don't use `onClick` on non-button HTMLElement, use Clickable 40 | context.report({ 41 | node, 42 | message: useClickableMessage, 43 | }); 44 | } 45 | }, 46 | }; 47 | }, 48 | }; 49 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-plugin-discord", 3 | "version": "0.1.2", 4 | "description": "ESLint plugins for Discord", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "./node_modules/.bin/mocha tests/lib/index.js" 8 | }, 9 | "keywords": [ 10 | "eslint", 11 | "eslint-plugin", 12 | "eslintplugin" 13 | ], 14 | "devDependencies": { 15 | "babel-eslint": "9.0.0", 16 | "eslint": "4.19.1", 17 | "jsx-ast-utils": "2.0.1", 18 | "mocha": "5.0.5" 19 | }, 20 | "private": true 21 | } 22 | -------------------------------------------------------------------------------- /tests/lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const RuleTester = require('eslint').RuleTester; 4 | 5 | const ruleTester = new RuleTester({ 6 | parserOptions: { 7 | ecmaVersion: 6, 8 | sourceType: 'module', 9 | ecmaFeatures: { 10 | jsx: true, 11 | }, 12 | }, 13 | }); 14 | 15 | const rules = [ 16 | require('./rules/react-import-style'), 17 | require('./rules/use-a11y-component'), 18 | require('./rules/camelcase-deprecation-support'), 19 | require('./rules/explicit-createref-type'), 20 | ]; 21 | 22 | rules.forEach(rule => rule(ruleTester)); 23 | -------------------------------------------------------------------------------- /tests/lib/rules/camelcase-deprecation-support.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @fileoverview Tests for camelcase rule. 3 | * @author Nicholas C. Zakas 4 | */ 5 | 6 | 'use strict'; 7 | 8 | //------------------------------------------------------------------------------ 9 | // Requirements 10 | //------------------------------------------------------------------------------ 11 | 12 | const rule = require('../../../lib/rules/camelcase-deprecation-support'); 13 | 14 | //------------------------------------------------------------------------------ 15 | // Tests 16 | //------------------------------------------------------------------------------ 17 | 18 | module.exports = ruleTester => 19 | ruleTester.run('camelcase-deprecation-support', rule, { 20 | valid: [ 21 | 'UNSAFE_componentDidMount = () => null;', 22 | 'firstName = "Nicholas"', 23 | 'FIRST_NAME = "Nicholas"', 24 | '__myPrivateVariable = "Patrick"', 25 | 'myPrivateVariable_ = "Patrick"', 26 | 'function doSomething(){}', 27 | 'do_something()', 28 | 'new do_something', 29 | 'new do_something()', 30 | 'foo.do_something()', 31 | 'var foo = bar.baz_boom;', 32 | 'var foo = bar.baz_boom.something;', 33 | 'foo.boom_pow.qux = bar.baz_boom.something;', 34 | 'if (bar.baz_boom) {}', 35 | 'var obj = { key: foo.bar_baz };', 36 | 'var arr = [foo.bar_baz];', 37 | '[foo.bar_baz]', 38 | 'var arr = [foo.bar_baz.qux];', 39 | '[foo.bar_baz.nesting]', 40 | 'if (foo.bar_baz === boom.bam_pow) { [foo.baz_boom] }', 41 | { 42 | code: 'var o = {key: 1}', 43 | options: [{properties: 'always'}], 44 | }, 45 | { 46 | code: 'var o = {_leading: 1}', 47 | options: [{properties: 'always'}], 48 | }, 49 | { 50 | code: 'var o = {trailing_: 1}', 51 | options: [{properties: 'always'}], 52 | }, 53 | { 54 | code: 'var o = {bar_baz: 1}', 55 | options: [{properties: 'never'}], 56 | }, 57 | { 58 | code: 'var o = {_leading: 1}', 59 | options: [{properties: 'never'}], 60 | }, 61 | { 62 | code: 'var o = {trailing_: 1}', 63 | options: [{properties: 'never'}], 64 | }, 65 | { 66 | code: 'obj.a_b = 2;', 67 | options: [{properties: 'never'}], 68 | }, 69 | { 70 | code: 'obj._a = 2;', 71 | options: [{properties: 'always'}], 72 | }, 73 | { 74 | code: 'obj.a_ = 2;', 75 | options: [{properties: 'always'}], 76 | }, 77 | { 78 | code: 'obj._a = 2;', 79 | options: [{properties: 'never'}], 80 | }, 81 | { 82 | code: 'obj.a_ = 2;', 83 | options: [{properties: 'never'}], 84 | }, 85 | { 86 | code: 'var obj = {\n a_a: 1 \n};\n obj.a_b = 2;', 87 | options: [{properties: 'never'}], 88 | }, 89 | { 90 | code: 'obj.foo_bar = function(){};', 91 | options: [{properties: 'never'}], 92 | }, 93 | { 94 | code: 'var { category_id: category } = query;', 95 | parserOptions: {ecmaVersion: 6}, 96 | }, 97 | { 98 | code: 'var { _leading } = query;', 99 | parserOptions: {ecmaVersion: 6}, 100 | }, 101 | { 102 | code: 'var { trailing_ } = query;', 103 | parserOptions: {ecmaVersion: 6}, 104 | }, 105 | { 106 | code: 'import { camelCased } from "external module";', 107 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 108 | }, 109 | { 110 | code: 'import { _leading } from "external module";', 111 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 112 | }, 113 | { 114 | code: 'import { trailing_ } from "external module";', 115 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 116 | }, 117 | { 118 | code: 'import { no_camelcased as camelCased } from "external-module";', 119 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 120 | }, 121 | { 122 | code: 'import { no_camelcased as _leading } from "external-module";', 123 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 124 | }, 125 | { 126 | code: 'import { no_camelcased as trailing_ } from "external-module";', 127 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 128 | }, 129 | { 130 | code: 'import { no_camelcased as camelCased, anoterCamelCased } from "external-module";', 131 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 132 | }, 133 | { 134 | code: 'function foo({ no_camelcased: camelCased }) {};', 135 | parserOptions: {ecmaVersion: 6}, 136 | }, 137 | { 138 | code: 'function foo({ no_camelcased: _leading }) {};', 139 | parserOptions: {ecmaVersion: 6}, 140 | }, 141 | { 142 | code: 'function foo({ no_camelcased: trailing_ }) {};', 143 | parserOptions: {ecmaVersion: 6}, 144 | }, 145 | { 146 | code: "function foo({ camelCased = 'default value' }) {};", 147 | parserOptions: {ecmaVersion: 6}, 148 | }, 149 | { 150 | code: "function foo({ _leading = 'default value' }) {};", 151 | parserOptions: {ecmaVersion: 6}, 152 | }, 153 | { 154 | code: "function foo({ trailing_ = 'default value' }) {};", 155 | parserOptions: {ecmaVersion: 6}, 156 | }, 157 | { 158 | code: 'function foo({ camelCased }) {};', 159 | parserOptions: {ecmaVersion: 6}, 160 | }, 161 | { 162 | code: 'function foo({ _leading }) {}', 163 | parserOptions: {ecmaVersion: 6}, 164 | }, 165 | { 166 | code: 'function foo({ trailing_ }) {}', 167 | parserOptions: {ecmaVersion: 6}, 168 | }, 169 | ], 170 | invalid: [ 171 | { 172 | code: 'UNSAFE_component_will_mount = () => null;', 173 | errors: [ 174 | { 175 | messageId: 'notCamelCase', 176 | data: {name: 'UNSAFE_component_will_mount'}, 177 | type: 'Identifier', 178 | }, 179 | ], 180 | }, 181 | { 182 | code: 'first_name = "Nicholas"', 183 | errors: [ 184 | { 185 | messageId: 'notCamelCase', 186 | data: {name: 'first_name'}, 187 | type: 'Identifier', 188 | }, 189 | ], 190 | }, 191 | { 192 | code: '__private_first_name = "Patrick"', 193 | errors: [ 194 | { 195 | messageId: 'notCamelCase', 196 | data: {name: '__private_first_name'}, 197 | type: 'Identifier', 198 | }, 199 | ], 200 | }, 201 | { 202 | code: 'function foo_bar(){}', 203 | errors: [ 204 | { 205 | messageId: 'notCamelCase', 206 | data: {name: 'foo_bar'}, 207 | type: 'Identifier', 208 | }, 209 | ], 210 | }, 211 | { 212 | code: 'obj.foo_bar = function(){};', 213 | errors: [ 214 | { 215 | messageId: 'notCamelCase', 216 | data: {name: 'foo_bar'}, 217 | type: 'Identifier', 218 | }, 219 | ], 220 | }, 221 | { 222 | code: 'bar_baz.foo = function(){};', 223 | errors: [ 224 | { 225 | messageId: 'notCamelCase', 226 | data: {name: 'bar_baz'}, 227 | type: 'Identifier', 228 | }, 229 | ], 230 | }, 231 | { 232 | code: '[foo_bar.baz]', 233 | errors: [ 234 | { 235 | messageId: 'notCamelCase', 236 | data: {name: 'foo_bar'}, 237 | type: 'Identifier', 238 | }, 239 | ], 240 | }, 241 | { 242 | code: 'if (foo.bar_baz === boom.bam_pow) { [foo_bar.baz] }', 243 | errors: [ 244 | { 245 | messageId: 'notCamelCase', 246 | data: {name: 'foo_bar'}, 247 | type: 'Identifier', 248 | }, 249 | ], 250 | }, 251 | { 252 | code: 'foo.bar_baz = boom.bam_pow', 253 | errors: [ 254 | { 255 | messageId: 'notCamelCase', 256 | data: {name: 'bar_baz'}, 257 | type: 'Identifier', 258 | }, 259 | ], 260 | }, 261 | { 262 | code: 'var foo = { bar_baz: boom.bam_pow }', 263 | errors: [ 264 | { 265 | messageId: 'notCamelCase', 266 | data: {name: 'bar_baz'}, 267 | type: 'Identifier', 268 | }, 269 | ], 270 | }, 271 | { 272 | code: 'foo.qux.boom_pow = { bar: boom.bam_pow }', 273 | errors: [ 274 | { 275 | messageId: 'notCamelCase', 276 | data: {name: 'boom_pow'}, 277 | type: 'Identifier', 278 | }, 279 | ], 280 | }, 281 | { 282 | code: 'var o = {bar_baz: 1}', 283 | options: [{properties: 'always'}], 284 | errors: [ 285 | { 286 | messageId: 'notCamelCase', 287 | data: {name: 'bar_baz'}, 288 | type: 'Identifier', 289 | }, 290 | ], 291 | }, 292 | { 293 | code: 'obj.a_b = 2;', 294 | options: [{properties: 'always'}], 295 | errors: [ 296 | { 297 | messageId: 'notCamelCase', 298 | data: {name: 'a_b'}, 299 | type: 'Identifier', 300 | }, 301 | ], 302 | }, 303 | { 304 | code: 'var { category_id: category_id } = query;', 305 | parserOptions: {ecmaVersion: 6}, 306 | errors: [ 307 | { 308 | messageId: 'notCamelCase', 309 | data: {name: 'category_id'}, 310 | type: 'Identifier', 311 | }, 312 | ], 313 | }, 314 | { 315 | code: 'var { category_id } = query;', 316 | parserOptions: {ecmaVersion: 6}, 317 | errors: [ 318 | { 319 | messageId: 'notCamelCase', 320 | data: {name: 'category_id'}, 321 | type: 'Identifier', 322 | }, 323 | ], 324 | }, 325 | { 326 | code: 'var { category_id = 1 } = query;', 327 | parserOptions: {ecmaVersion: 6}, 328 | errors: [ 329 | { 330 | message: "Identifier 'category_id' is not in camel case.", 331 | type: 'Identifier', 332 | }, 333 | ], 334 | }, 335 | { 336 | code: 'import no_camelcased from "external-module";', 337 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 338 | errors: [ 339 | { 340 | messageId: 'notCamelCase', 341 | data: {name: 'no_camelcased'}, 342 | type: 'Identifier', 343 | }, 344 | ], 345 | }, 346 | { 347 | code: 'import * as no_camelcased from "external-module";', 348 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 349 | errors: [ 350 | { 351 | messageId: 'notCamelCase', 352 | data: {name: 'no_camelcased'}, 353 | type: 'Identifier', 354 | }, 355 | ], 356 | }, 357 | { 358 | code: 'import { no_camelcased } from "external-module";', 359 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 360 | errors: [ 361 | { 362 | messageId: 'notCamelCase', 363 | data: {name: 'no_camelcased'}, 364 | type: 'Identifier', 365 | }, 366 | ], 367 | }, 368 | { 369 | code: 'import { no_camelcased as no_camel_cased } from "external module";', 370 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 371 | errors: [ 372 | { 373 | messageId: 'notCamelCase', 374 | data: {name: 'no_camel_cased'}, 375 | type: 'Identifier', 376 | }, 377 | ], 378 | }, 379 | { 380 | code: 'import { camelCased as no_camel_cased } from "external module";', 381 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 382 | errors: [ 383 | { 384 | messageId: 'notCamelCase', 385 | data: {name: 'no_camel_cased'}, 386 | type: 'Identifier', 387 | }, 388 | ], 389 | }, 390 | { 391 | code: 'import { camelCased, no_camelcased } from "external-module";', 392 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 393 | errors: [ 394 | { 395 | messageId: 'notCamelCase', 396 | data: {name: 'no_camelcased'}, 397 | type: 'Identifier', 398 | }, 399 | ], 400 | }, 401 | { 402 | code: 'import { no_camelcased as camelCased, another_no_camelcased } from "external-module";', 403 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 404 | errors: [ 405 | { 406 | messageId: 'notCamelCase', 407 | data: {name: 'another_no_camelcased'}, 408 | type: 'Identifier', 409 | }, 410 | ], 411 | }, 412 | { 413 | code: 'import camelCased, { no_camelcased } from "external-module";', 414 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 415 | errors: [ 416 | { 417 | messageId: 'notCamelCase', 418 | data: {name: 'no_camelcased'}, 419 | type: 'Identifier', 420 | }, 421 | ], 422 | }, 423 | { 424 | code: 'import no_camelcased, { another_no_camelcased as camelCased } from "external-module";', 425 | parserOptions: {ecmaVersion: 6, sourceType: 'module'}, 426 | errors: [ 427 | { 428 | messageId: 'notCamelCase', 429 | data: {name: 'no_camelcased'}, 430 | type: 'Identifier', 431 | }, 432 | ], 433 | }, 434 | { 435 | code: 'function foo({ no_camelcased }) {};', 436 | parserOptions: {ecmaVersion: 6}, 437 | errors: [ 438 | { 439 | message: "Identifier 'no_camelcased' is not in camel case.", 440 | type: 'Identifier', 441 | }, 442 | ], 443 | }, 444 | { 445 | code: "function foo({ no_camelcased = 'default value' }) {};", 446 | parserOptions: {ecmaVersion: 6}, 447 | errors: [ 448 | { 449 | message: "Identifier 'no_camelcased' is not in camel case.", 450 | type: 'Identifier', 451 | }, 452 | ], 453 | }, 454 | { 455 | code: 'const no_camelcased = 0; function foo({ camelcased_value = no_camelcased}) {}', 456 | parserOptions: {ecmaVersion: 6}, 457 | errors: [ 458 | { 459 | message: "Identifier 'no_camelcased' is not in camel case.", 460 | type: 'Identifier', 461 | }, 462 | { 463 | message: "Identifier 'camelcased_value' is not in camel case.", 464 | type: 'Identifier', 465 | }, 466 | ], 467 | }, 468 | { 469 | code: 'const { bar: no_camelcased } = foo;', 470 | parserOptions: {ecmaVersion: 6}, 471 | errors: [ 472 | { 473 | message: "Identifier 'no_camelcased' is not in camel case.", 474 | type: 'Identifier', 475 | }, 476 | ], 477 | }, 478 | { 479 | code: 'function foo({ value_1: my_default }) {}', 480 | parserOptions: {ecmaVersion: 6}, 481 | errors: [ 482 | { 483 | message: "Identifier 'my_default' is not in camel case.", 484 | type: 'Identifier', 485 | }, 486 | ], 487 | }, 488 | { 489 | code: 'function foo({ isCamelcased: no_camelcased }) {};', 490 | parserOptions: {ecmaVersion: 6}, 491 | errors: [ 492 | { 493 | message: "Identifier 'no_camelcased' is not in camel case.", 494 | type: 'Identifier', 495 | }, 496 | ], 497 | }, 498 | { 499 | code: 'var { foo: bar_baz = 1 } = quz;', 500 | parserOptions: {ecmaVersion: 6}, 501 | errors: [ 502 | { 503 | message: "Identifier 'bar_baz' is not in camel case.", 504 | type: 'Identifier', 505 | }, 506 | ], 507 | }, 508 | { 509 | code: 'const { no_camelcased = false } = bar;', 510 | parserOptions: {ecmaVersion: 6}, 511 | errors: [ 512 | { 513 | message: "Identifier 'no_camelcased' is not in camel case.", 514 | type: 'Identifier', 515 | }, 516 | ], 517 | }, 518 | ], 519 | }); 520 | -------------------------------------------------------------------------------- /tests/lib/rules/explicit-createref-type.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const rule = require("../../../lib/rules/explicit-createref-type"); 4 | const parser = require.resolve("babel-eslint"); 5 | 6 | module.exports = ruleTester => 7 | ruleTester.run("explicit-createref-type", rule, { 8 | valid: [ 9 | { 10 | parser, 11 | code: ` 12 | /* @flow */ 13 | 14 | import * as React from 'react'; 15 | 16 | class Test { 17 | a: {current: React.ElementRef<*> | null} = React.createRef(); 18 | b: * = React.createRef(); 19 | c = React.createElement(); 20 | d = {}; 21 | } 22 | ` 23 | }, 24 | { 25 | parser, 26 | code: ` 27 | /* @flow */ 28 | 29 | import * as React from 'react'; 30 | 31 | class Test { 32 | a = React.createRef<*>(); 33 | } 34 | ` 35 | } 36 | ], 37 | 38 | invalid: [ 39 | { 40 | parser, 41 | code: ` 42 | /* @flow */ 43 | import * as React from 'react'; 44 | class Test { a = React.createRef(); } 45 | `, 46 | errors: [{ messageId: "explicitCreateRefTypeMessage" }] 47 | } 48 | ] 49 | }); 50 | -------------------------------------------------------------------------------- /tests/lib/rules/react-import-style.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const rule = require('../../../lib/rules/react-import-style'); 4 | 5 | module.exports = ruleTester => 6 | ruleTester.run('react-import-style', rule, { 7 | valid: [ 8 | ` 9 | /* @flow */ 10 | 11 | import * as React from 'react'; 12 | import B from 'B'; 13 | `, 14 | `import A from 'A';`, 15 | ], 16 | 17 | invalid: [ 18 | { 19 | code: `import React from 'react';`, 20 | errors: [{messageId: 'improperReactImport'}], 21 | }, 22 | ], 23 | }); 24 | -------------------------------------------------------------------------------- /tests/lib/rules/use-a11y-component.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const rule = require('../../../lib/rules/use-a11y-component'); 4 | 5 | const onClick = `onClick={()=>{}}`; 6 | 7 | module.exports = ruleTester => 8 | ruleTester.run('use-a11y-component', rule, { 9 | valid: [`A`, ``], 10 | 11 | invalid: [ 12 | { 13 | code: `A`, 14 | errors: [{messageId: 'useAnchorMessage'}], 15 | }, 16 | { 17 | code: `
{}}>click
`, 18 | errors: [{messageId: 'useClickableMessage'}], 19 | }, 20 | ], 21 | }); 22 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | dependencies: 9 | "@babel/highlight" "^7.0.0" 10 | 11 | "@babel/generator@^7.0.0": 12 | version "7.0.0" 13 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" 14 | dependencies: 15 | "@babel/types" "^7.0.0" 16 | jsesc "^2.5.1" 17 | lodash "^4.17.10" 18 | source-map "^0.5.0" 19 | trim-right "^1.0.1" 20 | 21 | "@babel/helper-function-name@^7.1.0": 22 | version "7.1.0" 23 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" 24 | dependencies: 25 | "@babel/helper-get-function-arity" "^7.0.0" 26 | "@babel/template" "^7.1.0" 27 | "@babel/types" "^7.0.0" 28 | 29 | "@babel/helper-get-function-arity@^7.0.0": 30 | version "7.0.0" 31 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" 32 | dependencies: 33 | "@babel/types" "^7.0.0" 34 | 35 | "@babel/helper-split-export-declaration@^7.0.0": 36 | version "7.0.0" 37 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" 38 | dependencies: 39 | "@babel/types" "^7.0.0" 40 | 41 | "@babel/highlight@^7.0.0": 42 | version "7.0.0" 43 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 44 | dependencies: 45 | chalk "^2.0.0" 46 | esutils "^2.0.2" 47 | js-tokens "^4.0.0" 48 | 49 | "@babel/parser@^7.0.0", "@babel/parser@^7.1.0": 50 | version "7.1.0" 51 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.0.tgz#a7cd42cb3c12aec52e24375189a47b39759b783e" 52 | 53 | "@babel/template@^7.1.0": 54 | version "7.1.0" 55 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.0.tgz#58cc9572e1bfe24fe1537fdf99d839d53e517e22" 56 | dependencies: 57 | "@babel/code-frame" "^7.0.0" 58 | "@babel/parser" "^7.1.0" 59 | "@babel/types" "^7.0.0" 60 | 61 | "@babel/traverse@^7.0.0": 62 | version "7.1.0" 63 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" 64 | dependencies: 65 | "@babel/code-frame" "^7.0.0" 66 | "@babel/generator" "^7.0.0" 67 | "@babel/helper-function-name" "^7.1.0" 68 | "@babel/helper-split-export-declaration" "^7.0.0" 69 | "@babel/parser" "^7.1.0" 70 | "@babel/types" "^7.0.0" 71 | debug "^3.1.0" 72 | globals "^11.1.0" 73 | lodash "^4.17.10" 74 | 75 | "@babel/types@^7.0.0": 76 | version "7.0.0" 77 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" 78 | dependencies: 79 | esutils "^2.0.2" 80 | lodash "^4.17.10" 81 | to-fast-properties "^2.0.0" 82 | 83 | acorn-jsx@^3.0.0: 84 | version "3.0.1" 85 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 86 | dependencies: 87 | acorn "^3.0.4" 88 | 89 | acorn@^3.0.4: 90 | version "3.3.0" 91 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 92 | 93 | acorn@^5.5.0: 94 | version "5.5.3" 95 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" 96 | 97 | ajv-keywords@^2.1.0: 98 | version "2.1.1" 99 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" 100 | 101 | ajv@^5.2.3, ajv@^5.3.0: 102 | version "5.5.2" 103 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 104 | dependencies: 105 | co "^4.6.0" 106 | fast-deep-equal "^1.0.0" 107 | fast-json-stable-stringify "^2.0.0" 108 | json-schema-traverse "^0.3.0" 109 | 110 | ansi-escapes@^3.0.0: 111 | version "3.1.0" 112 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 113 | 114 | ansi-regex@^2.0.0: 115 | version "2.1.1" 116 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 117 | 118 | ansi-regex@^3.0.0: 119 | version "3.0.0" 120 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 121 | 122 | ansi-styles@^2.2.1: 123 | version "2.2.1" 124 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 125 | 126 | ansi-styles@^3.2.1: 127 | version "3.2.1" 128 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 129 | dependencies: 130 | color-convert "^1.9.0" 131 | 132 | argparse@^1.0.7: 133 | version "1.0.10" 134 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 135 | dependencies: 136 | sprintf-js "~1.0.2" 137 | 138 | array-includes@^3.0.3: 139 | version "3.0.3" 140 | resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" 141 | dependencies: 142 | define-properties "^1.1.2" 143 | es-abstract "^1.7.0" 144 | 145 | array-union@^1.0.1: 146 | version "1.0.2" 147 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 148 | dependencies: 149 | array-uniq "^1.0.1" 150 | 151 | array-uniq@^1.0.1: 152 | version "1.0.3" 153 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 154 | 155 | arrify@^1.0.0: 156 | version "1.0.1" 157 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 158 | 159 | babel-code-frame@^6.22.0: 160 | version "6.26.0" 161 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 162 | dependencies: 163 | chalk "^1.1.3" 164 | esutils "^2.0.2" 165 | js-tokens "^3.0.2" 166 | 167 | babel-eslint@9.0.0: 168 | version "9.0.0" 169 | resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-9.0.0.tgz#7d9445f81ed9f60aff38115f838970df9f2b6220" 170 | dependencies: 171 | "@babel/code-frame" "^7.0.0" 172 | "@babel/parser" "^7.0.0" 173 | "@babel/traverse" "^7.0.0" 174 | "@babel/types" "^7.0.0" 175 | eslint-scope "3.7.1" 176 | eslint-visitor-keys "^1.0.0" 177 | 178 | balanced-match@^1.0.0: 179 | version "1.0.0" 180 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 181 | 182 | brace-expansion@^1.1.7: 183 | version "1.1.11" 184 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 185 | dependencies: 186 | balanced-match "^1.0.0" 187 | concat-map "0.0.1" 188 | 189 | browser-stdout@1.3.1: 190 | version "1.3.1" 191 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 192 | 193 | buffer-from@^1.0.0: 194 | version "1.0.0" 195 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" 196 | 197 | caller-path@^0.1.0: 198 | version "0.1.0" 199 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 200 | dependencies: 201 | callsites "^0.2.0" 202 | 203 | callsites@^0.2.0: 204 | version "0.2.0" 205 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 206 | 207 | chalk@^1.1.3: 208 | version "1.1.3" 209 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 210 | dependencies: 211 | ansi-styles "^2.2.1" 212 | escape-string-regexp "^1.0.2" 213 | has-ansi "^2.0.0" 214 | strip-ansi "^3.0.0" 215 | supports-color "^2.0.0" 216 | 217 | chalk@^2.0.0, chalk@^2.1.0: 218 | version "2.4.1" 219 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 220 | dependencies: 221 | ansi-styles "^3.2.1" 222 | escape-string-regexp "^1.0.5" 223 | supports-color "^5.3.0" 224 | 225 | chardet@^0.4.0: 226 | version "0.4.2" 227 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" 228 | 229 | circular-json@^0.3.1: 230 | version "0.3.3" 231 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 232 | 233 | cli-cursor@^2.1.0: 234 | version "2.1.0" 235 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 236 | dependencies: 237 | restore-cursor "^2.0.0" 238 | 239 | cli-width@^2.0.0: 240 | version "2.2.0" 241 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 242 | 243 | co@^4.6.0: 244 | version "4.6.0" 245 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 246 | 247 | color-convert@^1.9.0: 248 | version "1.9.1" 249 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 250 | dependencies: 251 | color-name "^1.1.1" 252 | 253 | color-name@^1.1.1: 254 | version "1.1.3" 255 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 256 | 257 | commander@2.11.0: 258 | version "2.11.0" 259 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 260 | 261 | concat-map@0.0.1: 262 | version "0.0.1" 263 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 264 | 265 | concat-stream@^1.6.0: 266 | version "1.6.2" 267 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 268 | dependencies: 269 | buffer-from "^1.0.0" 270 | inherits "^2.0.3" 271 | readable-stream "^2.2.2" 272 | typedarray "^0.0.6" 273 | 274 | core-util-is@~1.0.0: 275 | version "1.0.2" 276 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 277 | 278 | cross-spawn@^5.1.0: 279 | version "5.1.0" 280 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 281 | dependencies: 282 | lru-cache "^4.0.1" 283 | shebang-command "^1.2.0" 284 | which "^1.2.9" 285 | 286 | debug@3.1.0, debug@^3.1.0: 287 | version "3.1.0" 288 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 289 | dependencies: 290 | ms "2.0.0" 291 | 292 | deep-is@~0.1.3: 293 | version "0.1.3" 294 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 295 | 296 | define-properties@^1.1.2: 297 | version "1.1.2" 298 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 299 | dependencies: 300 | foreach "^2.0.5" 301 | object-keys "^1.0.8" 302 | 303 | del@^2.0.2: 304 | version "2.2.2" 305 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 306 | dependencies: 307 | globby "^5.0.0" 308 | is-path-cwd "^1.0.0" 309 | is-path-in-cwd "^1.0.0" 310 | object-assign "^4.0.1" 311 | pify "^2.0.0" 312 | pinkie-promise "^2.0.0" 313 | rimraf "^2.2.8" 314 | 315 | diff@3.5.0: 316 | version "3.5.0" 317 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 318 | 319 | doctrine@^2.1.0: 320 | version "2.1.0" 321 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 322 | dependencies: 323 | esutils "^2.0.2" 324 | 325 | es-abstract@^1.7.0: 326 | version "1.11.0" 327 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681" 328 | dependencies: 329 | es-to-primitive "^1.1.1" 330 | function-bind "^1.1.1" 331 | has "^1.0.1" 332 | is-callable "^1.1.3" 333 | is-regex "^1.0.4" 334 | 335 | es-to-primitive@^1.1.1: 336 | version "1.1.1" 337 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 338 | dependencies: 339 | is-callable "^1.1.1" 340 | is-date-object "^1.0.1" 341 | is-symbol "^1.0.1" 342 | 343 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 344 | version "1.0.5" 345 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 346 | 347 | eslint-scope@3.7.1, eslint-scope@^3.7.1: 348 | version "3.7.1" 349 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" 350 | dependencies: 351 | esrecurse "^4.1.0" 352 | estraverse "^4.1.1" 353 | 354 | eslint-visitor-keys@^1.0.0: 355 | version "1.0.0" 356 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 357 | 358 | eslint@4.19.1: 359 | version "4.19.1" 360 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" 361 | dependencies: 362 | ajv "^5.3.0" 363 | babel-code-frame "^6.22.0" 364 | chalk "^2.1.0" 365 | concat-stream "^1.6.0" 366 | cross-spawn "^5.1.0" 367 | debug "^3.1.0" 368 | doctrine "^2.1.0" 369 | eslint-scope "^3.7.1" 370 | eslint-visitor-keys "^1.0.0" 371 | espree "^3.5.4" 372 | esquery "^1.0.0" 373 | esutils "^2.0.2" 374 | file-entry-cache "^2.0.0" 375 | functional-red-black-tree "^1.0.1" 376 | glob "^7.1.2" 377 | globals "^11.0.1" 378 | ignore "^3.3.3" 379 | imurmurhash "^0.1.4" 380 | inquirer "^3.0.6" 381 | is-resolvable "^1.0.0" 382 | js-yaml "^3.9.1" 383 | json-stable-stringify-without-jsonify "^1.0.1" 384 | levn "^0.3.0" 385 | lodash "^4.17.4" 386 | minimatch "^3.0.2" 387 | mkdirp "^0.5.1" 388 | natural-compare "^1.4.0" 389 | optionator "^0.8.2" 390 | path-is-inside "^1.0.2" 391 | pluralize "^7.0.0" 392 | progress "^2.0.0" 393 | regexpp "^1.0.1" 394 | require-uncached "^1.0.3" 395 | semver "^5.3.0" 396 | strip-ansi "^4.0.0" 397 | strip-json-comments "~2.0.1" 398 | table "4.0.2" 399 | text-table "~0.2.0" 400 | 401 | espree@^3.5.4: 402 | version "3.5.4" 403 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" 404 | dependencies: 405 | acorn "^5.5.0" 406 | acorn-jsx "^3.0.0" 407 | 408 | esprima@^4.0.0: 409 | version "4.0.0" 410 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 411 | 412 | esquery@^1.0.0: 413 | version "1.0.1" 414 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 415 | dependencies: 416 | estraverse "^4.0.0" 417 | 418 | esrecurse@^4.1.0: 419 | version "4.2.1" 420 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 421 | dependencies: 422 | estraverse "^4.1.0" 423 | 424 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 425 | version "4.2.0" 426 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 427 | 428 | esutils@^2.0.2: 429 | version "2.0.2" 430 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 431 | 432 | external-editor@^2.0.4: 433 | version "2.2.0" 434 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" 435 | dependencies: 436 | chardet "^0.4.0" 437 | iconv-lite "^0.4.17" 438 | tmp "^0.0.33" 439 | 440 | fast-deep-equal@^1.0.0: 441 | version "1.1.0" 442 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" 443 | 444 | fast-json-stable-stringify@^2.0.0: 445 | version "2.0.0" 446 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 447 | 448 | fast-levenshtein@~2.0.4: 449 | version "2.0.6" 450 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 451 | 452 | figures@^2.0.0: 453 | version "2.0.0" 454 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 455 | dependencies: 456 | escape-string-regexp "^1.0.5" 457 | 458 | file-entry-cache@^2.0.0: 459 | version "2.0.0" 460 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 461 | dependencies: 462 | flat-cache "^1.2.1" 463 | object-assign "^4.0.1" 464 | 465 | flat-cache@^1.2.1: 466 | version "1.3.0" 467 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 468 | dependencies: 469 | circular-json "^0.3.1" 470 | del "^2.0.2" 471 | graceful-fs "^4.1.2" 472 | write "^0.2.1" 473 | 474 | foreach@^2.0.5: 475 | version "2.0.5" 476 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 477 | 478 | fs.realpath@^1.0.0: 479 | version "1.0.0" 480 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 481 | 482 | function-bind@^1.0.2, function-bind@^1.1.1: 483 | version "1.1.1" 484 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 485 | 486 | functional-red-black-tree@^1.0.1: 487 | version "1.0.1" 488 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 489 | 490 | glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 491 | version "7.1.2" 492 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 493 | dependencies: 494 | fs.realpath "^1.0.0" 495 | inflight "^1.0.4" 496 | inherits "2" 497 | minimatch "^3.0.4" 498 | once "^1.3.0" 499 | path-is-absolute "^1.0.0" 500 | 501 | globals@^11.0.1: 502 | version "11.5.0" 503 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" 504 | 505 | globals@^11.1.0: 506 | version "11.7.0" 507 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" 508 | 509 | globby@^5.0.0: 510 | version "5.0.0" 511 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 512 | dependencies: 513 | array-union "^1.0.1" 514 | arrify "^1.0.0" 515 | glob "^7.0.3" 516 | object-assign "^4.0.1" 517 | pify "^2.0.0" 518 | pinkie-promise "^2.0.0" 519 | 520 | graceful-fs@^4.1.2: 521 | version "4.1.11" 522 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 523 | 524 | growl@1.10.3: 525 | version "1.10.3" 526 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" 527 | 528 | has-ansi@^2.0.0: 529 | version "2.0.0" 530 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 531 | dependencies: 532 | ansi-regex "^2.0.0" 533 | 534 | has-flag@^2.0.0: 535 | version "2.0.0" 536 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 537 | 538 | has-flag@^3.0.0: 539 | version "3.0.0" 540 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 541 | 542 | has@^1.0.1: 543 | version "1.0.1" 544 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 545 | dependencies: 546 | function-bind "^1.0.2" 547 | 548 | he@1.1.1: 549 | version "1.1.1" 550 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 551 | 552 | iconv-lite@^0.4.17: 553 | version "0.4.23" 554 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 555 | dependencies: 556 | safer-buffer ">= 2.1.2 < 3" 557 | 558 | ignore@^3.3.3: 559 | version "3.3.8" 560 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" 561 | 562 | imurmurhash@^0.1.4: 563 | version "0.1.4" 564 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 565 | 566 | inflight@^1.0.4: 567 | version "1.0.6" 568 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 569 | dependencies: 570 | once "^1.3.0" 571 | wrappy "1" 572 | 573 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 574 | version "2.0.3" 575 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 576 | 577 | inquirer@^3.0.6: 578 | version "3.3.0" 579 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" 580 | dependencies: 581 | ansi-escapes "^3.0.0" 582 | chalk "^2.0.0" 583 | cli-cursor "^2.1.0" 584 | cli-width "^2.0.0" 585 | external-editor "^2.0.4" 586 | figures "^2.0.0" 587 | lodash "^4.3.0" 588 | mute-stream "0.0.7" 589 | run-async "^2.2.0" 590 | rx-lite "^4.0.8" 591 | rx-lite-aggregates "^4.0.8" 592 | string-width "^2.1.0" 593 | strip-ansi "^4.0.0" 594 | through "^2.3.6" 595 | 596 | is-callable@^1.1.1, is-callable@^1.1.3: 597 | version "1.1.3" 598 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 599 | 600 | is-date-object@^1.0.1: 601 | version "1.0.1" 602 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 603 | 604 | is-fullwidth-code-point@^2.0.0: 605 | version "2.0.0" 606 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 607 | 608 | is-path-cwd@^1.0.0: 609 | version "1.0.0" 610 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 611 | 612 | is-path-in-cwd@^1.0.0: 613 | version "1.0.1" 614 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 615 | dependencies: 616 | is-path-inside "^1.0.0" 617 | 618 | is-path-inside@^1.0.0: 619 | version "1.0.1" 620 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 621 | dependencies: 622 | path-is-inside "^1.0.1" 623 | 624 | is-promise@^2.1.0: 625 | version "2.1.0" 626 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 627 | 628 | is-regex@^1.0.4: 629 | version "1.0.4" 630 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 631 | dependencies: 632 | has "^1.0.1" 633 | 634 | is-resolvable@^1.0.0: 635 | version "1.1.0" 636 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 637 | 638 | is-symbol@^1.0.1: 639 | version "1.0.1" 640 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 641 | 642 | isarray@~1.0.0: 643 | version "1.0.0" 644 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 645 | 646 | isexe@^2.0.0: 647 | version "2.0.0" 648 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 649 | 650 | js-tokens@^3.0.2: 651 | version "3.0.2" 652 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 653 | 654 | js-tokens@^4.0.0: 655 | version "4.0.0" 656 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 657 | 658 | js-yaml@^3.9.1: 659 | version "3.11.0" 660 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" 661 | dependencies: 662 | argparse "^1.0.7" 663 | esprima "^4.0.0" 664 | 665 | jsesc@^2.5.1: 666 | version "2.5.1" 667 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" 668 | 669 | json-schema-traverse@^0.3.0: 670 | version "0.3.1" 671 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 672 | 673 | json-stable-stringify-without-jsonify@^1.0.1: 674 | version "1.0.1" 675 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 676 | 677 | jsx-ast-utils@2.0.1: 678 | version "2.0.1" 679 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" 680 | dependencies: 681 | array-includes "^3.0.3" 682 | 683 | levn@^0.3.0, levn@~0.3.0: 684 | version "0.3.0" 685 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 686 | dependencies: 687 | prelude-ls "~1.1.2" 688 | type-check "~0.3.2" 689 | 690 | lodash@^4.17.10: 691 | version "4.17.11" 692 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 693 | 694 | lodash@^4.17.4, lodash@^4.3.0: 695 | version "4.17.10" 696 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" 697 | 698 | lru-cache@^4.0.1: 699 | version "4.1.3" 700 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" 701 | dependencies: 702 | pseudomap "^1.0.2" 703 | yallist "^2.1.2" 704 | 705 | mimic-fn@^1.0.0: 706 | version "1.2.0" 707 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 708 | 709 | minimatch@^3.0.2, minimatch@^3.0.4: 710 | version "3.0.4" 711 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 712 | dependencies: 713 | brace-expansion "^1.1.7" 714 | 715 | minimist@0.0.8: 716 | version "0.0.8" 717 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 718 | 719 | mkdirp@0.5.1, mkdirp@^0.5.1: 720 | version "0.5.1" 721 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 722 | dependencies: 723 | minimist "0.0.8" 724 | 725 | mocha@5.0.5: 726 | version "5.0.5" 727 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.5.tgz#e228e3386b9387a4710007a641f127b00be44b52" 728 | dependencies: 729 | browser-stdout "1.3.1" 730 | commander "2.11.0" 731 | debug "3.1.0" 732 | diff "3.5.0" 733 | escape-string-regexp "1.0.5" 734 | glob "7.1.2" 735 | growl "1.10.3" 736 | he "1.1.1" 737 | mkdirp "0.5.1" 738 | supports-color "4.4.0" 739 | 740 | ms@2.0.0: 741 | version "2.0.0" 742 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 743 | 744 | mute-stream@0.0.7: 745 | version "0.0.7" 746 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 747 | 748 | natural-compare@^1.4.0: 749 | version "1.4.0" 750 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 751 | 752 | object-assign@^4.0.1: 753 | version "4.1.1" 754 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 755 | 756 | object-keys@^1.0.8: 757 | version "1.0.11" 758 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 759 | 760 | once@^1.3.0: 761 | version "1.4.0" 762 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 763 | dependencies: 764 | wrappy "1" 765 | 766 | onetime@^2.0.0: 767 | version "2.0.1" 768 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 769 | dependencies: 770 | mimic-fn "^1.0.0" 771 | 772 | optionator@^0.8.2: 773 | version "0.8.2" 774 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 775 | dependencies: 776 | deep-is "~0.1.3" 777 | fast-levenshtein "~2.0.4" 778 | levn "~0.3.0" 779 | prelude-ls "~1.1.2" 780 | type-check "~0.3.2" 781 | wordwrap "~1.0.0" 782 | 783 | os-tmpdir@~1.0.2: 784 | version "1.0.2" 785 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 786 | 787 | path-is-absolute@^1.0.0: 788 | version "1.0.1" 789 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 790 | 791 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 792 | version "1.0.2" 793 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 794 | 795 | pify@^2.0.0: 796 | version "2.3.0" 797 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 798 | 799 | pinkie-promise@^2.0.0: 800 | version "2.0.1" 801 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 802 | dependencies: 803 | pinkie "^2.0.0" 804 | 805 | pinkie@^2.0.0: 806 | version "2.0.4" 807 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 808 | 809 | pluralize@^7.0.0: 810 | version "7.0.0" 811 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 812 | 813 | prelude-ls@~1.1.2: 814 | version "1.1.2" 815 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 816 | 817 | process-nextick-args@~2.0.0: 818 | version "2.0.0" 819 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 820 | 821 | progress@^2.0.0: 822 | version "2.0.0" 823 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 824 | 825 | pseudomap@^1.0.2: 826 | version "1.0.2" 827 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 828 | 829 | readable-stream@^2.2.2: 830 | version "2.3.6" 831 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 832 | dependencies: 833 | core-util-is "~1.0.0" 834 | inherits "~2.0.3" 835 | isarray "~1.0.0" 836 | process-nextick-args "~2.0.0" 837 | safe-buffer "~5.1.1" 838 | string_decoder "~1.1.1" 839 | util-deprecate "~1.0.1" 840 | 841 | regexpp@^1.0.1: 842 | version "1.1.0" 843 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" 844 | 845 | require-uncached@^1.0.3: 846 | version "1.0.3" 847 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 848 | dependencies: 849 | caller-path "^0.1.0" 850 | resolve-from "^1.0.0" 851 | 852 | resolve-from@^1.0.0: 853 | version "1.0.1" 854 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 855 | 856 | restore-cursor@^2.0.0: 857 | version "2.0.0" 858 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 859 | dependencies: 860 | onetime "^2.0.0" 861 | signal-exit "^3.0.2" 862 | 863 | rimraf@^2.2.8: 864 | version "2.6.2" 865 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 866 | dependencies: 867 | glob "^7.0.5" 868 | 869 | run-async@^2.2.0: 870 | version "2.3.0" 871 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 872 | dependencies: 873 | is-promise "^2.1.0" 874 | 875 | rx-lite-aggregates@^4.0.8: 876 | version "4.0.8" 877 | resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" 878 | dependencies: 879 | rx-lite "*" 880 | 881 | rx-lite@*, rx-lite@^4.0.8: 882 | version "4.0.8" 883 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" 884 | 885 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 886 | version "5.1.2" 887 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 888 | 889 | "safer-buffer@>= 2.1.2 < 3": 890 | version "2.1.2" 891 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 892 | 893 | semver@^5.3.0: 894 | version "5.5.0" 895 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 896 | 897 | shebang-command@^1.2.0: 898 | version "1.2.0" 899 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 900 | dependencies: 901 | shebang-regex "^1.0.0" 902 | 903 | shebang-regex@^1.0.0: 904 | version "1.0.0" 905 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 906 | 907 | signal-exit@^3.0.2: 908 | version "3.0.2" 909 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 910 | 911 | slice-ansi@1.0.0: 912 | version "1.0.0" 913 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 914 | dependencies: 915 | is-fullwidth-code-point "^2.0.0" 916 | 917 | source-map@^0.5.0: 918 | version "0.5.7" 919 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 920 | 921 | sprintf-js@~1.0.2: 922 | version "1.0.3" 923 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 924 | 925 | string-width@^2.1.0, string-width@^2.1.1: 926 | version "2.1.1" 927 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 928 | dependencies: 929 | is-fullwidth-code-point "^2.0.0" 930 | strip-ansi "^4.0.0" 931 | 932 | string_decoder@~1.1.1: 933 | version "1.1.1" 934 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 935 | dependencies: 936 | safe-buffer "~5.1.0" 937 | 938 | strip-ansi@^3.0.0: 939 | version "3.0.1" 940 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 941 | dependencies: 942 | ansi-regex "^2.0.0" 943 | 944 | strip-ansi@^4.0.0: 945 | version "4.0.0" 946 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 947 | dependencies: 948 | ansi-regex "^3.0.0" 949 | 950 | strip-json-comments@~2.0.1: 951 | version "2.0.1" 952 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 953 | 954 | supports-color@4.4.0: 955 | version "4.4.0" 956 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" 957 | dependencies: 958 | has-flag "^2.0.0" 959 | 960 | supports-color@^2.0.0: 961 | version "2.0.0" 962 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 963 | 964 | supports-color@^5.3.0: 965 | version "5.4.0" 966 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 967 | dependencies: 968 | has-flag "^3.0.0" 969 | 970 | table@4.0.2: 971 | version "4.0.2" 972 | resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" 973 | dependencies: 974 | ajv "^5.2.3" 975 | ajv-keywords "^2.1.0" 976 | chalk "^2.1.0" 977 | lodash "^4.17.4" 978 | slice-ansi "1.0.0" 979 | string-width "^2.1.1" 980 | 981 | text-table@~0.2.0: 982 | version "0.2.0" 983 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 984 | 985 | through@^2.3.6: 986 | version "2.3.8" 987 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 988 | 989 | tmp@^0.0.33: 990 | version "0.0.33" 991 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 992 | dependencies: 993 | os-tmpdir "~1.0.2" 994 | 995 | to-fast-properties@^2.0.0: 996 | version "2.0.0" 997 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 998 | 999 | trim-right@^1.0.1: 1000 | version "1.0.1" 1001 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1002 | 1003 | type-check@~0.3.2: 1004 | version "0.3.2" 1005 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1006 | dependencies: 1007 | prelude-ls "~1.1.2" 1008 | 1009 | typedarray@^0.0.6: 1010 | version "0.0.6" 1011 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1012 | 1013 | util-deprecate@~1.0.1: 1014 | version "1.0.2" 1015 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1016 | 1017 | which@^1.2.9: 1018 | version "1.3.0" 1019 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 1020 | dependencies: 1021 | isexe "^2.0.0" 1022 | 1023 | wordwrap@~1.0.0: 1024 | version "1.0.0" 1025 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 1026 | 1027 | wrappy@1: 1028 | version "1.0.2" 1029 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1030 | 1031 | write@^0.2.1: 1032 | version "0.2.1" 1033 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 1034 | dependencies: 1035 | mkdirp "^0.5.1" 1036 | 1037 | yallist@^2.1.2: 1038 | version "2.1.2" 1039 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1040 | --------------------------------------------------------------------------------