├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .jshintignore ├── .prettierrc.js ├── .travis.yml ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── README.md ├── index.js ├── lib ├── ember-router-generator.js └── helpers │ ├── find-function-expression.js │ ├── find-routes.js │ ├── new-function-expression.js │ ├── route-node.js │ └── route-options-node.js ├── package.json ├── tests ├── fixtures │ ├── bar-foos-bar-route.js │ ├── bar-foos-double-bar-route.js │ ├── bar-foos-index-route.js │ ├── basic-route-with-destructuring.js │ ├── basic-route.js │ ├── class-syntax-foos-route.js │ ├── class-syntax.js │ ├── custom-identifier-route.js │ ├── deeply-nested-custom-identifier.js │ ├── double-foos-route.js │ ├── edit-deeply-nested-custom-identifier.js │ ├── edit-foo-route-with-reset-namespace-option.js │ ├── edit-foo-route.js │ ├── foos-bar-baz-mount.js │ ├── foos-bar-baz-route.js │ ├── foos-bar-index-route.js │ ├── foos-bar-post-bar-route.js │ ├── foos-bar-route-with-reset-namespace-option.js │ ├── foos-bar-route.js │ ├── foos-double-bar-route.js │ ├── foos-edit-mount.js │ ├── foos-edit-route.js │ ├── foos-index-index-mount.js │ ├── foos-index-index-route.js │ ├── foos-index-route.js │ ├── foos-index-with-options-index-route.js │ ├── foos-index-with-options-route.js │ ├── foos-route-with-destructuring.js │ ├── foos-route.js │ ├── foos-with-reset-namespace-option.js │ ├── multi-bar-foos-bar-route.js │ ├── route-with-if-adding.js │ ├── route-with-if-removing.js │ ├── route-with-if.js │ ├── route-with-other-expressions-adding.js │ ├── route-with-other-expressions.js │ └── user-route.js ├── generator-test.js ├── helpers │ └── ast-equality.js └── jshint-test.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | indent_style = space 14 | indent_size = 2 15 | 16 | [*.hbs] 17 | insert_final_newline = false 18 | 19 | [*.{diff,md}] 20 | trim_trailing_whitespace = false 21 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /tests/fixtures/ 2 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parserOptions: { 4 | ecmaVersion: 2018, 5 | }, 6 | plugins: ['mocha', 'node'], 7 | extends: ['eslint:recommended', 'plugin:node/recommended', 'prettier'], 8 | env: { 9 | browser: false, 10 | node: true, 11 | es6: true, 12 | }, 13 | globals: {}, 14 | rules: { 15 | /*** For compatibility with existing source */ 16 | 'no-var': 0, 17 | 'no-undef': 0, 18 | 'strict': 0, 19 | 'object-shorthand': 0, 20 | 'no-lonely-if': 0, 21 | 22 | /*** Possible Errors ***/ 23 | 24 | 'no-console': 0, 25 | 'no-template-curly-in-string': 2, 26 | 'no-unsafe-negation': 2, 27 | 28 | /*** Best Practices ***/ 29 | 30 | curly: 2, 31 | eqeqeq: 2, 32 | 'guard-for-in': 0, 33 | 'no-caller': 2, 34 | 'no-eq-null': 2, 35 | 'no-eval': 2, 36 | 'no-new': 0, 37 | 'no-unused-expressions': [ 38 | 2, 39 | { 40 | allowShortCircuit: true, 41 | allowTernary: true, 42 | }, 43 | ], 44 | 'wrap-iife': 0, 45 | yoda: 2, 46 | 47 | /*** Variables ***/ 48 | 49 | 'no-unused-vars': 2, 50 | 'no-use-before-define': [2, 'nofunc'], 51 | 52 | /*** Stylistic Issues ***/ 53 | 54 | camelcase: 2, 55 | 'new-cap': [2, { properties: false }], 56 | 'no-array-constructor': 2, 57 | 'no-bitwise': 2, 58 | 'no-plusplus': 0, 59 | 'no-unneeded-ternary': 2, 60 | 61 | /*** ECMAScript 6 ***/ 62 | 63 | 'no-useless-computed-key': 2, 64 | 'prefer-template': 2, 65 | 'symbol-description': 2, 66 | }, 67 | }; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | 7 | # dependencies 8 | /node_modules 9 | /bower_components/* 10 | 11 | # misc 12 | /.sass-cache 13 | /connect.lock 14 | /coverage/* 15 | /libpeerconnection.log 16 | npm-debug.log 17 | testem.log 18 | -------------------------------------------------------------------------------- /.jshintignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | tests/fixtures/* 3 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | singleQuote: true, 5 | trailingComma: 'es5', 6 | printWidth: 120, 7 | }; -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '8' 4 | - '10' 5 | 6 | deploy: 7 | provider: npm 8 | email: stefan.penner+ember-cli@gmail.com 9 | api_key: 10 | secure: mjbVCbbvGouyNmo3mi0anoUH4ktpfnSLwUYgJjnLUHQQVOHEmw/N41tEXCOv0IjZVjjMBknPs3T/aflcT6r8/zvpQjtT5F4n8/GL3Wy7DdG2P4NIm9S70EbyutETNhxx6axJA7TpHMUkQp24IyxRdt6hTqf9BGAws/tjQ3hZjR8= 11 | on: 12 | tags: true 13 | repo: ember-cli/ember-router-generator 14 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # ember-router-generator Changelog 2 | 3 | # 2.0.0 4 | 5 | * Drop support for Node 4, 6, 9, and 11. 6 | * Added support for more modern syntax (e.g. `class` and decorators) in the `app/router.js` file 7 | 8 | # 1.1.1 9 | 10 | Fix bug so route options object is not generated if there is no valid 11 | option. 12 | 13 | 14 | # 1.1.0 15 | 16 | Add support for `resetNamespace` when generating routes. For more info 17 | see [#12](https://github.com/ember-cli/ember-router-generator/pull/12). 18 | 19 | ## 1.0.0 20 | 21 | Removes support for `resource` routes. Now only `route` is supported. 22 | 23 | See [#11](https://github.com/ember-cli/ember-router-generator/pull/11) 24 | for more info. 25 | 26 | ### 0.4.0 27 | 28 | Adds special handling for index routes. When running `ember g route 29 | foo/index` the generated route will be `this.route('foo', function() 30 | {})`. 31 | 32 | If there is a route like `this.route('foo', function() {})` running 33 | `ember d route foo/index` will modify it to `this.route('foo');` since we 34 | are just removing the index. 35 | 36 | For more info see [#10](https://github.com/ember-cli/ember-router-generator/pull/10). 37 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | +The Ember team and community are committed to everyone having a safe and inclusive experience. 2 | + 3 | +**Our Community Guidelines / Code of Conduct can be found here**: 4 | + 5 | +http://emberjs.com/guidelines/ 6 | + 7 | +For a history of updates, see the page history here: 8 | + 9 | +https://github.com/emberjs/website/commits/master/source/guidelines.html.erb 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ember-route-generator [![Build Status](https://travis-ci.org/ember-cli/ember-router-generator.png?branch=master)](https://travis-ci.org/ember-cli/ember-route-generator) 2 | 3 | MicroLib to add or remove routes from your Ember.js router. 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/ember-router-generator'); 2 | -------------------------------------------------------------------------------- /lib/ember-router-generator.js: -------------------------------------------------------------------------------- 1 | module.exports = EmberRouterGenerator; 2 | 3 | var recast = require('recast'); 4 | var parser = require('recast/parsers/babel'); 5 | 6 | var findFunctionExpression = require('./helpers/find-function-expression'); 7 | var findRoutes = require('./helpers/find-routes'); 8 | var newFunctionExpression = require('./helpers/new-function-expression'); 9 | var routeNode = require('./helpers/route-node'); 10 | 11 | function EmberRouterGenerator(source, ast) { 12 | this.source = source; 13 | this.ast = ast; 14 | this.mapNode = null; 15 | 16 | this._ast(); 17 | this._walk(); 18 | } 19 | 20 | EmberRouterGenerator.prototype.clone = function() { 21 | return new EmberRouterGenerator(this.code()); 22 | }; 23 | 24 | EmberRouterGenerator.prototype._ast = function() { 25 | return (this.ast = this.ast || recast.parse(this.source, { parser })); 26 | }; 27 | 28 | EmberRouterGenerator.prototype._walk = function() { 29 | var petal = this; 30 | 31 | recast.visit(this._ast(), { 32 | visitCallExpression: function(path) { 33 | var node = path.node; 34 | 35 | if (node.callee.type === 'MemberExpression' && node.callee.property.name === 'map') { 36 | petal.mapNode = node; 37 | 38 | return false; 39 | } else { 40 | this.traverse(path); 41 | } 42 | } 43 | }); 44 | }; 45 | 46 | EmberRouterGenerator.prototype.add = function(routeName, options) { 47 | if (typeof this.mapNode === 'undefined') { 48 | throw new Error('Source doesn\'t include Ember.map'); 49 | } 50 | 51 | var route = this.clone(); 52 | var routes = route.mapNode.arguments[0].body.body; 53 | 54 | route._add.call( 55 | route, 56 | routeName.split('/'), 57 | routes, 58 | options 59 | ); 60 | 61 | return route; 62 | }; 63 | 64 | 65 | 66 | EmberRouterGenerator.prototype._add = function(nameParts, routes, options) { 67 | if (nameParts[0] === "") { 68 | nameParts = nameParts.slice(1); 69 | } 70 | options = options || {}; 71 | var parent = nameParts[0]; 72 | var name = parent; 73 | var children = nameParts.slice(1); 74 | var paths = findRoutes(parent, routes, options.identifier); 75 | var route = paths.length ? paths[paths.length - 1].node : false; 76 | 77 | if (!route) { 78 | route = routeNode(name, options); 79 | routes.push(route); 80 | } 81 | 82 | if (children.length > 0) { 83 | var routesFunction = findFunctionExpression(route.expression.arguments); 84 | 85 | if (!routesFunction) { 86 | routesFunction = newFunctionExpression(); 87 | route.expression.arguments.push(routesFunction); 88 | } 89 | 90 | var isAutogeneratedIndexRoute = isIndexRoute(children) && !options.path; 91 | if (!isAutogeneratedIndexRoute) { 92 | this._add(children, routesFunction.body.body, options); 93 | } 94 | } 95 | }; 96 | 97 | EmberRouterGenerator.prototype.remove = function(routeName, options) { 98 | if (typeof this.mapNode === 'undefined') { 99 | throw new Error('Source doesn\'t include Ember.map'); 100 | } 101 | 102 | options = options || {}; 103 | 104 | var route = this.clone(); 105 | var routes = route.mapNode.arguments[0].body.body; 106 | 107 | var newRoutes = route._remove.call( 108 | route, 109 | routeName.split('/'), 110 | routes, 111 | options 112 | ); 113 | 114 | if (newRoutes) { 115 | route.mapNode.arguments[0].body.body = newRoutes; 116 | } 117 | 118 | return route; 119 | }; 120 | 121 | EmberRouterGenerator.prototype._remove = function(nameParts, routes, options) { 122 | if (nameParts[0] === "") { 123 | nameParts = nameParts.slice(1); 124 | } 125 | var parent = nameParts[0]; 126 | var children = nameParts.slice(1); 127 | var paths = findRoutes(parent, routes, options.identifier); 128 | var context = this; 129 | 130 | return paths.reduce(function(routes, path) { 131 | var newRoutes = context._removePath(routes, parent, children, path, options); 132 | 133 | return newRoutes || routes; 134 | }, false); 135 | }; 136 | 137 | EmberRouterGenerator.prototype._removePath = function(routes, parent, children, path, options) { 138 | var route = path ? path.node : path; 139 | var newRoutes; 140 | 141 | if (children.length > 0) { 142 | var routesFunction = route.expression && findFunctionExpression(route.expression.arguments); 143 | 144 | if(isIndexRoute(children)) { 145 | removeSubRoute(path.node); 146 | var isAutogeneratedIndexRoute = parent === 'index' && lastExprArg(path.node).type !== 'ObjectExpression'; 147 | if (isAutogeneratedIndexRoute) { 148 | path.replace(); 149 | } 150 | return routes; 151 | } 152 | 153 | if (routesFunction) { 154 | newRoutes = this._remove(children, routesFunction.body.body, options); 155 | 156 | if (newRoutes) { 157 | routesFunction.body.body = newRoutes; 158 | } 159 | 160 | return routes; 161 | } 162 | } else { 163 | if (route) { 164 | path.replace(); 165 | 166 | return routes; 167 | } else { 168 | return false; 169 | } 170 | } 171 | }; 172 | 173 | EmberRouterGenerator.prototype.code = function(options) { 174 | options = options || { tabWidth: 2, quote: 'single' }; 175 | 176 | return recast.print(this.ast, options).code; 177 | }; 178 | 179 | function lastExprArg(node) { 180 | return node.expression.arguments[node.expression.arguments.length-1]; 181 | } 182 | 183 | function removeSubRoute(node) { 184 | var lastArgument = lastExprArg(node); 185 | if(lastArgument.type === 'FunctionExpression') { 186 | node.expression.arguments.pop(); 187 | } 188 | } 189 | 190 | function isIndexRoute(children) { 191 | return children.length === 1 && children[children.length-1] === 'index'; 192 | } 193 | -------------------------------------------------------------------------------- /lib/helpers/find-function-expression.js: -------------------------------------------------------------------------------- 1 | module.exports = function findFunctionExpression(nodes) { 2 | var node; 3 | 4 | for (var i = 0; i < nodes.length; i++) { 5 | node = nodes[i]; 6 | 7 | if (node.type === 'FunctionExpression') { 8 | return node; 9 | } 10 | } 11 | 12 | return false; 13 | }; 14 | -------------------------------------------------------------------------------- /lib/helpers/find-routes.js: -------------------------------------------------------------------------------- 1 | var recast = require('recast'); 2 | 3 | function isRoute(node, identifier) { 4 | var callee = node.expression.callee; 5 | return node.expression.type === 'CallExpression' && 6 | callee.type === 'MemberExpression' && 7 | (callee.property.name === 'route' || callee.property.name === identifier); 8 | } 9 | 10 | function isTopLevelExpression(path) { 11 | return path.scope === null; 12 | } 13 | 14 | module.exports = function findRoutes(name, routes, identifier) { 15 | var nodePaths = []; 16 | 17 | recast.visit(routes, { 18 | visitExpressionStatement: function(path) { 19 | var node = path.node; 20 | 21 | if (isRoute(node, identifier) && 22 | isTopLevelExpression(path) && 23 | node.expression.arguments[0].value === name) { 24 | nodePaths.push(path); 25 | 26 | return false; 27 | } else { 28 | this.traverse(path); 29 | } 30 | } 31 | }); 32 | 33 | return nodePaths; 34 | }; 35 | -------------------------------------------------------------------------------- /lib/helpers/new-function-expression.js: -------------------------------------------------------------------------------- 1 | var builders = require('recast').types.builders; 2 | 3 | module.exports = function newFunctionExpression() { 4 | return builders.functionExpression( 5 | null, 6 | [], 7 | builders.blockStatement([]) 8 | ); 9 | }; 10 | -------------------------------------------------------------------------------- /lib/helpers/route-node.js: -------------------------------------------------------------------------------- 1 | var builders = require('recast').types.builders; 2 | var routeOptionsNode = require('./route-options-node'); 3 | 4 | 5 | module.exports = function routeNode(name, options) { 6 | options = options || {}; 7 | 8 | var node = builders.expressionStatement( 9 | builders.callExpression( 10 | builders.memberExpression( 11 | builders.thisExpression(), 12 | builders.identifier(options.identifier || 'route'), 13 | false 14 | ), 15 | [builders.literal(name)] 16 | ) 17 | ); 18 | 19 | var optionsNode = routeOptionsNode(options); 20 | if (optionsNode) { 21 | node.expression.arguments.push(optionsNode); 22 | } 23 | 24 | return node; 25 | }; 26 | -------------------------------------------------------------------------------- /lib/helpers/route-options-node.js: -------------------------------------------------------------------------------- 1 | var builders = require('recast').types.builders; 2 | 3 | module.exports = function routeOptionNode(options) { 4 | options = options || {}; 5 | 6 | var node = builders.objectExpression([]); 7 | var properties = []; 8 | 9 | if (options.path) { 10 | properties.push( 11 | builders.property( 12 | 'init', 13 | builders.identifier('path'), 14 | builders.literal(options.path) 15 | ) 16 | ); 17 | } 18 | 19 | if (options.hasOwnProperty('resetNamespace')) { 20 | properties.push( 21 | builders.property( 22 | 'init', 23 | builders.identifier('resetNamespace'), 24 | builders.literal(options.resetNamespace) 25 | ) 26 | ); 27 | } 28 | 29 | if (!properties.length) { 30 | return null; 31 | } 32 | 33 | node.properties = node.properties.concat(properties); 34 | 35 | return node; 36 | }; 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ember-router-generator", 3 | "version": "2.0.0", 4 | "description": "MicroLib to add or remove routes from your Ember.js router.", 5 | "main": "index.js", 6 | "files": [ 7 | "index.js", 8 | "lib/" 9 | ], 10 | "directories": { 11 | "test": "tests" 12 | }, 13 | "scripts": { 14 | "test": "mocha tests/**/*-test.js", 15 | "ci": "mocha tests/**/*-test.js" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "https://github.com/ember-cli/ember-router-generator.git" 20 | }, 21 | "dependencies": { 22 | "@babel/parser": "^7.14.0", 23 | "@babel/traverse": "^7.14.8", 24 | "recast": "^0.19.1" 25 | }, 26 | "devDependencies": { 27 | "assertion-error": "^1.1.0", 28 | "chai": "^4.3.4", 29 | "eslint": "^6.8.0", 30 | "eslint-config-prettier": "^6.15.0", 31 | "eslint-plugin-mocha": "^6.3.0", 32 | "eslint-plugin-node": "^11.1.0", 33 | "mocha": "^6.2.2", 34 | "mocha-eslint": "^5.0.0", 35 | "prettier": "^1.19.1" 36 | }, 37 | "author": "Adolfo Builes", 38 | "license": "MIT", 39 | "bugs": { 40 | "url": "https://github.com/ember-cli/ember-router-generator/issues" 41 | }, 42 | "homepage": "https://github.com/ember-cli/ember-router-generator", 43 | "engines": { 44 | "node": "8.* || 10.* || >= 12" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /tests/fixtures/bar-foos-bar-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('bar'); 3 | this.route('foos', function() { 4 | this.route('bar'); 5 | }); 6 | }); 7 | -------------------------------------------------------------------------------- /tests/fixtures/bar-foos-double-bar-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('bar'); 3 | this.route('foos', function() { 4 | this.route('bar'); 5 | this.route('bar'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/bar-foos-index-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('bar'); 3 | this.route('foos', function() {}); 4 | }); 5 | -------------------------------------------------------------------------------- /tests/fixtures/basic-route-with-destructuring.js: -------------------------------------------------------------------------------- 1 | const { get, run } = Ember; 2 | 3 | Router.map(function() { 4 | }); 5 | -------------------------------------------------------------------------------- /tests/fixtures/basic-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | }); 3 | -------------------------------------------------------------------------------- /tests/fixtures/class-syntax-foos-route.js: -------------------------------------------------------------------------------- 1 | class AppRouter extends Router { 2 | @someDecorator location = config.locationType; 3 | rootURL = config.rootURL; 4 | } 5 | 6 | Router.map(function() { 7 | this.route('foos'); 8 | }); 9 | -------------------------------------------------------------------------------- /tests/fixtures/class-syntax.js: -------------------------------------------------------------------------------- 1 | class AppRouter extends Router { 2 | @someDecorator location = config.locationType; 3 | rootURL = config.rootURL; 4 | } 5 | 6 | Router.map(function() { 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/custom-identifier-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.mount('blog'); 3 | }); 4 | -------------------------------------------------------------------------------- /tests/fixtures/deeply-nested-custom-identifier.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('blog', function() { 3 | this.route('ember', function() { 4 | this.mount('engines'); 5 | }); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/double-foos-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos'); 3 | this.route('foos'); 4 | }); 5 | -------------------------------------------------------------------------------- /tests/fixtures/edit-deeply-nested-custom-identifier.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('blog', function() { 3 | this.route('ember', function() {}); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/edit-foo-route-with-reset-namespace-option.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('edit', { path: ':foo_id/edit', resetNamespace: false }); 3 | }); 4 | -------------------------------------------------------------------------------- /tests/fixtures/edit-foo-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('edit', { path: ':foo_id/edit' }); 3 | }); 4 | -------------------------------------------------------------------------------- /tests/fixtures/foos-bar-baz-mount.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.mount('foos', function() { 3 | this.mount('bar', function() { 4 | this.mount('baz'); 5 | }); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/foos-bar-baz-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('bar', function() { 4 | this.route('baz'); 5 | }); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/foos-bar-index-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('bar', function() {}); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-bar-post-bar-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('bar'); 3 | this.route('foos', function() { 4 | this.route('bar'); 5 | }); 6 | }); 7 | -------------------------------------------------------------------------------- /tests/fixtures/foos-bar-route-with-reset-namespace-option.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('bar', { resetNamespace: true }); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-bar-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('bar'); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-double-bar-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('bar'); 4 | this.route('bar'); 5 | }); 6 | }); 7 | -------------------------------------------------------------------------------- /tests/fixtures/foos-edit-mount.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.mount('edit', { path: ':foo_id/edit' }); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-edit-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('edit', { path: ':foo_id/edit' }); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-index-index-mount.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.mount('index', function() {}); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-index-index-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('index', function() {}); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-index-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() {}); 3 | }); 4 | -------------------------------------------------------------------------------- /tests/fixtures/foos-index-with-options-index-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('index', { path: 'main' }, function() {}); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-index-with-options-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', function() { 3 | this.route('index', { path: 'main' }); 4 | }); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-route-with-destructuring.js: -------------------------------------------------------------------------------- 1 | const { get, run } = Ember; 2 | 3 | Router.map(function() { 4 | this.route('foos'); 5 | }); 6 | -------------------------------------------------------------------------------- /tests/fixtures/foos-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos'); 3 | }); 4 | -------------------------------------------------------------------------------- /tests/fixtures/foos-with-reset-namespace-option.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('foos', { resetNamespace: true }); 3 | }); 4 | -------------------------------------------------------------------------------- /tests/fixtures/multi-bar-foos-bar-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('bar'); 3 | this.route('bar'); 4 | this.route('foos', function() { 5 | this.route('bar'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/route-with-if-adding.js: -------------------------------------------------------------------------------- 1 | Router.map(function () { 2 | if (features.foo) { 3 | this.route('foos', function () { 4 | this.route('bar'); 5 | }); 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/route-with-if-removing.js: -------------------------------------------------------------------------------- 1 | Router.map(function () { 2 | if (features.foo) { 3 | } 4 | }); 5 | -------------------------------------------------------------------------------- /tests/fixtures/route-with-if.js: -------------------------------------------------------------------------------- 1 | Router.map(function () { 2 | if (features.foo) { 3 | this.route('foos', function () { 4 | }); 5 | } 6 | }); 7 | -------------------------------------------------------------------------------- /tests/fixtures/route-with-other-expressions-adding.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | 42 === 42; 3 | "string"; 4 | var i; 5 | i = 42; 6 | this.route('bar'); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixtures/route-with-other-expressions.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | 42 === 42; 3 | "string"; 4 | var i; 5 | i = 42; 6 | }); 7 | -------------------------------------------------------------------------------- /tests/fixtures/user-route.js: -------------------------------------------------------------------------------- 1 | Router.map(function() { 2 | this.route('users', { resetNamespace: true }, function() { 3 | this.route('new'); 4 | 5 | this.route('edit', { 6 | path: ':user_id/edit' 7 | }); 8 | 9 | this.route('show', { 10 | path: ':user_id' 11 | }); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /tests/generator-test.js: -------------------------------------------------------------------------------- 1 | var EmberRouterGenerator = require('../index.js'); 2 | var fs = require('fs'); 3 | var astEquality = require('./helpers/ast-equality'); 4 | 5 | describe('Adding routes', function() { 6 | it('adds routes', function() { 7 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 8 | 9 | var routes = new EmberRouterGenerator(source); 10 | var newRoutes = routes.add('foos'); 11 | 12 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-route.js')); 13 | }); 14 | 15 | it('handles files with class syntax', function() { 16 | var source = fs.readFileSync('./tests/fixtures/class-syntax.js'); 17 | 18 | var routes = new EmberRouterGenerator(source); 19 | var newRoutes = routes.add('foos'); 20 | 21 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/class-syntax-foos-route.js')); 22 | }); 23 | 24 | it('adds routes with leading slash', function() { 25 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 26 | 27 | var routes = new EmberRouterGenerator(source); 28 | var newRoutes = routes.add('/foos'); 29 | 30 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-route.js')); 31 | }); 32 | 33 | it('leaves untouched existing routes', function() { 34 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 35 | 36 | var routes = new EmberRouterGenerator(source); 37 | var newRoutes = routes.add('foos'); 38 | 39 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-route.js')); 40 | }); 41 | 42 | 43 | it('adds nested routes', function() { 44 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 45 | var routes = new EmberRouterGenerator(source); 46 | 47 | var newRoutes = routes.add('foos/bar'); 48 | 49 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-route.js')); 50 | }); 51 | 52 | it('add nested routes in existing route', function() { 53 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 54 | var routes = new EmberRouterGenerator(source); 55 | 56 | var newRoutes = routes.add('foos/bar'); 57 | 58 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-route.js')); 59 | }); 60 | 61 | it('add nested routes in existing nested route', function() { 62 | var source = fs.readFileSync('./tests/fixtures/foos-bar-route.js'); 63 | var routes = new EmberRouterGenerator(source); 64 | 65 | var newRoutes = routes.add('foos/bar/baz'); 66 | 67 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-baz-route.js')); 68 | }); 69 | 70 | it('adds deeply nested routes', function() { 71 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 72 | var routes = new EmberRouterGenerator(source); 73 | 74 | var newRoutes = routes.add('foos/bar/baz'); 75 | 76 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-baz-route.js')); 77 | }); 78 | 79 | it('adds deeply nested routes with custom identifiers', function() { 80 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 81 | var routes = new EmberRouterGenerator(source); 82 | 83 | var newRoutes = routes.add('foos/bar/baz', { identifier: 'mount' }); 84 | 85 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-baz-mount.js')); 86 | }); 87 | 88 | it('adds route with path', function() { 89 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 90 | var routes = new EmberRouterGenerator(source); 91 | 92 | var newRoutes = routes.add('edit', { path: ':foo_id/edit' }); 93 | 94 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/edit-foo-route.js')); 95 | }); 96 | 97 | it('adds route with custom identifier', function() { 98 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 99 | var routes = new EmberRouterGenerator(source); 100 | 101 | var newRoutes = routes.add('blog', { identifier: 'mount' }); 102 | 103 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/custom-identifier-route.js')); 104 | }); 105 | 106 | it('adds nested route with path', function() { 107 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 108 | var routes = new EmberRouterGenerator(source); 109 | 110 | var newRoutes = routes.add('foos/edit', { path: ':foo_id/edit' }); 111 | 112 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-edit-route.js')); 113 | }); 114 | 115 | it('adds nested route with path and custom identifier', function() { 116 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 117 | var routes = new EmberRouterGenerator(source); 118 | 119 | var newRoutes = routes.add('foos/edit', { path: ':foo_id/edit', identifier: 'mount' }); 120 | 121 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-edit-mount.js')); 122 | }); 123 | 124 | it('adds routes even if other statements are present in the route', function() { 125 | var source = fs.readFileSync('./tests/fixtures/route-with-if.js'); 126 | var routes = new EmberRouterGenerator(source); 127 | 128 | var newRoutes = routes.add('foos/bar'); 129 | 130 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/route-with-if-adding.js')); 131 | }); 132 | 133 | it('adds routes even if other expression statements are present', function() { 134 | var source = fs.readFileSync('./tests/fixtures/route-with-other-expressions.js'); 135 | var routes = new EmberRouterGenerator(source); 136 | 137 | var newRoutes = routes.add('bar'); 138 | 139 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/route-with-other-expressions-adding.js')); 140 | }); 141 | 142 | it('adds index route using an empty function', function() { 143 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 144 | var routes = new EmberRouterGenerator(source); 145 | 146 | var newRoutes = routes.add('foos/index'); 147 | 148 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-route.js')); 149 | }); 150 | 151 | it('adds index route using the route method when passing options', function() { 152 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 153 | var routes = new EmberRouterGenerator(source); 154 | 155 | var newRoutes = routes.add('foos/index', { path: 'main' }); 156 | 157 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-with-options-route.js')); 158 | }); 159 | 160 | it('adds index route in intermediate index routes', function() { 161 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 162 | var routes = new EmberRouterGenerator(source); 163 | 164 | var newRoutes = routes.add('foos/index/index'); 165 | 166 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-index-route.js')); 167 | }); 168 | 169 | it('adds index route in intermediate index routes with custom identifier', function() { 170 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 171 | var routes = new EmberRouterGenerator(source); 172 | 173 | var newRoutes = routes.add('foos/index/index', { identifier: 'mount' }); 174 | 175 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-index-mount.js')); 176 | }); 177 | 178 | it('ignores unknown options', function() { 179 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 180 | 181 | var routes = new EmberRouterGenerator(source); 182 | var newRoutes = routes.add('foos', { foo: true, bar: false }); 183 | 184 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-route.js')); 185 | }); 186 | 187 | it('ignores unknown options when mixed with valid ones', function() { 188 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 189 | var routes = new EmberRouterGenerator(source); 190 | 191 | var newRoutes = routes.add('edit', { path: ':foo_id/edit', unknow: 'something' }); 192 | 193 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/edit-foo-route.js')); 194 | }); 195 | 196 | it('can pass the resetNamespace option', function() { 197 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 198 | var routes = new EmberRouterGenerator(source); 199 | 200 | var newRoutes = routes.add('foos', { resetNamespace: true }); 201 | 202 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-with-reset-namespace-option.js')); 203 | }); 204 | 205 | it('can pass the resetNamespace and path options', function() { 206 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 207 | var routes = new EmberRouterGenerator(source); 208 | 209 | var newRoutes = routes.add('edit', { path: ':foo_id/edit', resetNamespace: false }); 210 | 211 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/edit-foo-route-with-reset-namespace-option.js')); 212 | }); 213 | 214 | it('can pass the resetNamespace option in nested routes', function() { 215 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 216 | var routes = new EmberRouterGenerator(source); 217 | 218 | var newRoutes = routes.add('foos/bar', { resetNamespace: true }); 219 | 220 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-route-with-reset-namespace-option.js')); 221 | }); 222 | }); 223 | 224 | 225 | describe('Removing routes', function() { 226 | it('removes routes', function() { 227 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 228 | 229 | var routes = new EmberRouterGenerator(source); 230 | var newRoutes = routes.remove('foos'); 231 | 232 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/basic-route.js')); 233 | }); 234 | 235 | it('removes routes with leading slash', function() { 236 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 237 | 238 | var routes = new EmberRouterGenerator(source); 239 | var newRoutes = routes.remove('/foos'); 240 | 241 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/basic-route.js')); 242 | }); 243 | 244 | it('removes routes with custom identifier', function() { 245 | var source = fs.readFileSync('./tests/fixtures/custom-identifier-route.js'); 246 | 247 | var routes = new EmberRouterGenerator(source); 248 | var newRoutes = routes.remove('blog', { identifier: 'mount' }); 249 | 250 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/basic-route.js')); 251 | }); 252 | 253 | it('removes nested routes', function() { 254 | var source = fs.readFileSync('./tests/fixtures/foos-bar-route.js'); 255 | var routes = new EmberRouterGenerator(source); 256 | 257 | var newRoutes = routes.remove('foos/bar'); 258 | 259 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-route.js')); 260 | }); 261 | 262 | it('does not remove nested routes inappropriately', function() { 263 | var source = fs.readFileSync('./tests/fixtures/foos-bar-route.js'); 264 | var routes = new EmberRouterGenerator(source); 265 | 266 | var newRoutes = routes.remove('bar'); 267 | 268 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-route.js')); 269 | }); 270 | 271 | it('removes deeply nested routes', function() { 272 | var source = fs.readFileSync('./tests/fixtures/foos-bar-baz-route.js'); 273 | var routes = new EmberRouterGenerator(source); 274 | 275 | var newRoutes = routes.remove('foos/bar/baz'); 276 | 277 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-index-route.js')); 278 | }); 279 | 280 | it('removes deeply nested routes with custom identifiers', function() { 281 | var source = fs.readFileSync('./tests/fixtures/deeply-nested-custom-identifier.js'); 282 | var routes = new EmberRouterGenerator(source); 283 | 284 | var newRoutes = routes.remove('blog/ember/engines', { identifier: 'mount' }); 285 | 286 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/edit-deeply-nested-custom-identifier.js')); 287 | }); 288 | 289 | it('removes routes with children', function() { 290 | var source = fs.readFileSync('./tests/fixtures/foos-bar-route.js'); 291 | var routes = new EmberRouterGenerator(source); 292 | 293 | var newRoutes = routes.remove('foos'); 294 | 295 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/basic-route.js')); 296 | }); 297 | 298 | it('removes routes with deeply nested children', function() { 299 | var source = fs.readFileSync('./tests/fixtures/foos-bar-baz-route.js'); 300 | var routes = new EmberRouterGenerator(source); 301 | 302 | var newRoutes = routes.remove('foos'); 303 | 304 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/basic-route.js')); 305 | }); 306 | 307 | it('fails gracefully when removing a route that does not exist', function() { 308 | var source = fs.readFileSync('./tests/fixtures/basic-route.js'); 309 | var routes = new EmberRouterGenerator(source); 310 | 311 | var newRoutes = routes.remove('foos'); 312 | 313 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/basic-route.js')); 314 | }); 315 | 316 | it('fails gracefully when removing a nested route that does not exist', function() { 317 | var source = fs.readFileSync('./tests/fixtures/foos-route.js'); 318 | var routes = new EmberRouterGenerator(source); 319 | 320 | var newRoutes = routes.remove('foos/qux'); 321 | 322 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-route.js')); 323 | }); 324 | 325 | it('remove routes even if other statements are present in the route', function() { 326 | var source = fs.readFileSync('./tests/fixtures/route-with-if.js'); 327 | var routes = new EmberRouterGenerator(source); 328 | 329 | var newRoutes = routes.remove('foos'); 330 | 331 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/route-with-if-removing.js')); 332 | }); 333 | 334 | it('removes routes even if other expression statements are present', function() { 335 | var source = fs.readFileSync('./tests/fixtures/route-with-other-expressions-adding.js'); 336 | var routes = new EmberRouterGenerator(source); 337 | 338 | var newRoutes = routes.remove('bar'); 339 | 340 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/route-with-other-expressions.js')); 341 | }); 342 | 343 | it('uses empty functions to replace intermediate index routes', function() { 344 | var source = fs.readFileSync('./tests/fixtures/foos-index-route.js'); 345 | var routes = new EmberRouterGenerator(source); 346 | 347 | var newRoutes = routes.remove('foos/index'); 348 | 349 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-route.js')); 350 | }); 351 | 352 | it('uses empty functions to replace nested intermediate index routes', function() { 353 | var source = fs.readFileSync('./tests/fixtures/foos-index-index-route.js'); 354 | var routes = new EmberRouterGenerator(source); 355 | 356 | var newRoutes = routes.remove('foos/index/index'); 357 | 358 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-route.js')); 359 | }); 360 | 361 | it('removes index routes preserving the parent route options', function() { 362 | var source = fs.readFileSync('./tests/fixtures/foos-index-with-options-index-route.js'); 363 | var routes = new EmberRouterGenerator(source); 364 | 365 | var newRoutes = routes.remove('foos/index/index'); 366 | 367 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-with-options-route.js')); 368 | }); 369 | 370 | it('removes routes that have an identically named nested route after them', function() { 371 | var source = fs.readFileSync('./tests/fixtures/bar-foos-bar-route.js'); 372 | var routes = new EmberRouterGenerator(source); 373 | 374 | var newRoutes = routes.remove('bar'); 375 | 376 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-route.js')); 377 | }); 378 | 379 | it('removes routes that have an identically named nested route before them', function() { 380 | var source = fs.readFileSync('./tests/fixtures/foos-bar-post-bar-route.js'); 381 | var routes = new EmberRouterGenerator(source); 382 | 383 | var newRoutes = routes.remove('bar'); 384 | 385 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-route.js')); 386 | }); 387 | 388 | it('removes duplicate copies of the specified top-level route', function() { 389 | var source = fs.readFileSync('./tests/fixtures/double-foos-route.js'); 390 | var routes = new EmberRouterGenerator(source); 391 | 392 | var newRoutes = routes.remove('foos'); 393 | 394 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/basic-route.js')); 395 | }); 396 | 397 | it('removes duplicate copies of the specified nested route', function() { 398 | var source = fs.readFileSync('./tests/fixtures/foos-double-bar-route.js'); 399 | var routes = new EmberRouterGenerator(source); 400 | 401 | var newRoutes = routes.remove('foos/bar'); 402 | 403 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-index-route.js')); 404 | }); 405 | 406 | it('removes duplicate copies of the specified top-level route when there is a preceding identically named nested route', function() { 407 | var source = fs.readFileSync('./tests/fixtures/multi-bar-foos-bar-route.js'); 408 | var routes = new EmberRouterGenerator(source); 409 | 410 | var newRoutes = routes.remove('bar'); 411 | 412 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-bar-route.js')); 413 | }); 414 | 415 | it('removes duplicate copies of the specified nested route when there are identically named top-level routes', function() { 416 | var source = fs.readFileSync('./tests/fixtures/bar-foos-double-bar-route.js'); 417 | var routes = new EmberRouterGenerator(source); 418 | 419 | var newRoutes = routes.remove('foos/bar'); 420 | 421 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/bar-foos-index-route.js')); 422 | }); 423 | }); 424 | 425 | describe('esnext syntax compatibility', function() { 426 | it('can add to a router file that uses destructuring', function() { 427 | var source = fs.readFileSync('./tests/fixtures/basic-route-with-destructuring.js'); 428 | var routes = new EmberRouterGenerator(source); 429 | 430 | var newRoutes = routes.add('foos'); 431 | 432 | astEquality(newRoutes.code(), fs.readFileSync('./tests/fixtures/foos-route-with-destructuring.js')); 433 | }); 434 | }); 435 | -------------------------------------------------------------------------------- /tests/helpers/ast-equality.js: -------------------------------------------------------------------------------- 1 | function EqualityError(message, actual, expected) { 2 | this.message = message; 3 | this.actual = actual; 4 | this.expected = expected; 5 | this.showDiff = true; 6 | Error.captureStackTrace(this, module.exports); 7 | } 8 | 9 | EqualityError.prototype = Object.create(Error.prototype); 10 | EqualityError.prototype.name = 'EqualityError'; 11 | EqualityError.prototype.constructor = EqualityError; 12 | 13 | var recast = require('recast'); 14 | var parser = require('recast/parsers/babel'); 15 | var traverse = require('@babel/traverse').default; 16 | 17 | module.exports = function(actual, expected, message) { 18 | var parsedActual = recast.parse(actual.toString(), { parser }); 19 | var parsedExpected = recast.parse(expected.toString(), { parser }); 20 | 21 | // Removes source-specific metadata from AST nodes 22 | stripSourceInfo(parsedActual, parsedExpected); 23 | 24 | var seemEqual = JSON.stringify(parsedActual) === JSON.stringify(parsedExpected); 25 | 26 | if (!seemEqual) { 27 | throw new EqualityError(message || "AST equality failed", 28 | recast.print(parsedActual).code, 29 | recast.print(parsedExpected).code 30 | ); 31 | } 32 | }; 33 | 34 | function stripSourceInfo(ast1, ast2) { 35 | const stripNode = node => { 36 | delete node.tokens; 37 | delete node.loc; 38 | delete node.start; 39 | delete node.end; 40 | } 41 | 42 | traverse.cheap(ast1, stripNode); 43 | traverse.cheap(ast2, stripNode); 44 | } 45 | -------------------------------------------------------------------------------- /tests/jshint-test.js: -------------------------------------------------------------------------------- 1 | require('mocha-eslint')(['lib', 'index.js', 'tests/*.js', 'tests/helpers']); 2 | -------------------------------------------------------------------------------- /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", "@babel/code-frame@^7.14.5": 6 | version "7.14.5" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" 8 | integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== 9 | dependencies: 10 | "@babel/highlight" "^7.14.5" 11 | 12 | "@babel/generator@^7.14.8": 13 | version "7.14.8" 14 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.8.tgz#bf86fd6af96cf3b74395a8ca409515f89423e070" 15 | integrity sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg== 16 | dependencies: 17 | "@babel/types" "^7.14.8" 18 | jsesc "^2.5.1" 19 | source-map "^0.5.0" 20 | 21 | "@babel/helper-function-name@^7.14.5": 22 | version "7.14.5" 23 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" 24 | integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== 25 | dependencies: 26 | "@babel/helper-get-function-arity" "^7.14.5" 27 | "@babel/template" "^7.14.5" 28 | "@babel/types" "^7.14.5" 29 | 30 | "@babel/helper-get-function-arity@^7.14.5": 31 | version "7.14.5" 32 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" 33 | integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== 34 | dependencies: 35 | "@babel/types" "^7.14.5" 36 | 37 | "@babel/helper-hoist-variables@^7.14.5": 38 | version "7.14.5" 39 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" 40 | integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== 41 | dependencies: 42 | "@babel/types" "^7.14.5" 43 | 44 | "@babel/helper-split-export-declaration@^7.14.5": 45 | version "7.14.5" 46 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" 47 | integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== 48 | dependencies: 49 | "@babel/types" "^7.14.5" 50 | 51 | "@babel/helper-validator-identifier@^7.14.5": 52 | version "7.14.5" 53 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" 54 | integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== 55 | 56 | "@babel/helper-validator-identifier@^7.14.8": 57 | version "7.14.8" 58 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz#32be33a756f29e278a0d644fa08a2c9e0f88a34c" 59 | integrity sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow== 60 | 61 | "@babel/highlight@^7.14.5": 62 | version "7.14.5" 63 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" 64 | integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== 65 | dependencies: 66 | "@babel/helper-validator-identifier" "^7.14.5" 67 | chalk "^2.0.0" 68 | js-tokens "^4.0.0" 69 | 70 | "@babel/parser@^7.14.0", "@babel/parser@^7.14.5", "@babel/parser@^7.14.8": 71 | version "7.14.8" 72 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.8.tgz#66fd41666b2d7b840bd5ace7f7416d5ac60208d4" 73 | integrity sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA== 74 | 75 | "@babel/template@^7.14.5": 76 | version "7.14.5" 77 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" 78 | integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== 79 | dependencies: 80 | "@babel/code-frame" "^7.14.5" 81 | "@babel/parser" "^7.14.5" 82 | "@babel/types" "^7.14.5" 83 | 84 | "@babel/traverse@^7.14.8": 85 | version "7.14.8" 86 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.8.tgz#c0253f02677c5de1a8ff9df6b0aacbec7da1a8ce" 87 | integrity sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg== 88 | dependencies: 89 | "@babel/code-frame" "^7.14.5" 90 | "@babel/generator" "^7.14.8" 91 | "@babel/helper-function-name" "^7.14.5" 92 | "@babel/helper-hoist-variables" "^7.14.5" 93 | "@babel/helper-split-export-declaration" "^7.14.5" 94 | "@babel/parser" "^7.14.8" 95 | "@babel/types" "^7.14.8" 96 | debug "^4.1.0" 97 | globals "^11.1.0" 98 | 99 | "@babel/types@^7.14.5", "@babel/types@^7.14.8": 100 | version "7.14.8" 101 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.8.tgz#38109de8fcadc06415fbd9b74df0065d4d41c728" 102 | integrity sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q== 103 | dependencies: 104 | "@babel/helper-validator-identifier" "^7.14.8" 105 | to-fast-properties "^2.0.0" 106 | 107 | acorn-jsx@^5.0.0: 108 | version "5.0.1" 109 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" 110 | integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== 111 | 112 | acorn-jsx@^5.1.0: 113 | version "5.1.0" 114 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" 115 | integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== 116 | 117 | acorn@^6.0.7: 118 | version "6.4.1" 119 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" 120 | integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== 121 | 122 | acorn@^7.1.0: 123 | version "7.1.0" 124 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" 125 | integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== 126 | 127 | ajv@^6.10.0, ajv@^6.9.1: 128 | version "6.10.0" 129 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" 130 | integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== 131 | dependencies: 132 | fast-deep-equal "^2.0.1" 133 | fast-json-stable-stringify "^2.0.0" 134 | json-schema-traverse "^0.4.1" 135 | uri-js "^4.2.2" 136 | 137 | ansi-colors@3.2.3: 138 | version "3.2.3" 139 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 140 | integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== 141 | 142 | ansi-escapes@^3.2.0: 143 | version "3.2.0" 144 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 145 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 146 | 147 | ansi-escapes@^4.2.1: 148 | version "4.2.1" 149 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.2.1.tgz#4dccdb846c3eee10f6d64dea66273eab90c37228" 150 | integrity sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q== 151 | dependencies: 152 | type-fest "^0.5.2" 153 | 154 | ansi-regex@^3.0.0: 155 | version "3.0.0" 156 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 157 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 158 | 159 | ansi-regex@^4.1.0: 160 | version "4.1.0" 161 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 162 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 163 | 164 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 165 | version "3.2.1" 166 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 167 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 168 | dependencies: 169 | color-convert "^1.9.0" 170 | 171 | argparse@^1.0.7: 172 | version "1.0.10" 173 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 174 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 175 | dependencies: 176 | sprintf-js "~1.0.2" 177 | 178 | assertion-error@^1.1.0: 179 | version "1.1.0" 180 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 181 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 182 | 183 | ast-types@0.13.3: 184 | version "0.13.3" 185 | resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7" 186 | integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== 187 | 188 | astral-regex@^1.0.0: 189 | version "1.0.0" 190 | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" 191 | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 192 | 193 | balanced-match@^1.0.0: 194 | version "1.0.0" 195 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 196 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 197 | 198 | brace-expansion@^1.1.7: 199 | version "1.1.11" 200 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 201 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 202 | dependencies: 203 | balanced-match "^1.0.0" 204 | concat-map "0.0.1" 205 | 206 | browser-stdout@1.3.1: 207 | version "1.3.1" 208 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 209 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 210 | 211 | callsites@^3.0.0: 212 | version "3.1.0" 213 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 214 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 215 | 216 | camelcase@^5.0.0: 217 | version "5.3.1" 218 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 219 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 220 | 221 | chai@^4.3.4: 222 | version "4.3.4" 223 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" 224 | integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== 225 | dependencies: 226 | assertion-error "^1.1.0" 227 | check-error "^1.0.2" 228 | deep-eql "^3.0.1" 229 | get-func-name "^2.0.0" 230 | pathval "^1.1.1" 231 | type-detect "^4.0.5" 232 | 233 | chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2: 234 | version "2.4.2" 235 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 236 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 237 | dependencies: 238 | ansi-styles "^3.2.1" 239 | escape-string-regexp "^1.0.5" 240 | supports-color "^5.3.0" 241 | 242 | chardet@^0.7.0: 243 | version "0.7.0" 244 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 245 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 246 | 247 | check-error@^1.0.2: 248 | version "1.0.2" 249 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 250 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 251 | 252 | cli-cursor@^2.1.0: 253 | version "2.1.0" 254 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 255 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 256 | dependencies: 257 | restore-cursor "^2.0.0" 258 | 259 | cli-cursor@^3.1.0: 260 | version "3.1.0" 261 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" 262 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 263 | dependencies: 264 | restore-cursor "^3.1.0" 265 | 266 | cli-width@^2.0.0: 267 | version "2.2.0" 268 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 269 | integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 270 | 271 | cliui@^5.0.0: 272 | version "5.0.0" 273 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 274 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 275 | dependencies: 276 | string-width "^3.1.0" 277 | strip-ansi "^5.2.0" 278 | wrap-ansi "^5.1.0" 279 | 280 | color-convert@^1.9.0: 281 | version "1.9.3" 282 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 283 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 284 | dependencies: 285 | color-name "1.1.3" 286 | 287 | color-name@1.1.3: 288 | version "1.1.3" 289 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 290 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 291 | 292 | concat-map@0.0.1: 293 | version "0.0.1" 294 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 295 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 296 | 297 | cross-spawn@^6.0.5: 298 | version "6.0.5" 299 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 300 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 301 | dependencies: 302 | nice-try "^1.0.4" 303 | path-key "^2.0.1" 304 | semver "^5.5.0" 305 | shebang-command "^1.2.0" 306 | which "^1.2.9" 307 | 308 | debug@3.2.6: 309 | version "3.2.6" 310 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 311 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 312 | dependencies: 313 | ms "^2.1.1" 314 | 315 | debug@^4.0.1, debug@^4.1.0: 316 | version "4.1.1" 317 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 318 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 319 | dependencies: 320 | ms "^2.1.1" 321 | 322 | decamelize@^1.2.0: 323 | version "1.2.0" 324 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 325 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 326 | 327 | deep-eql@^3.0.1: 328 | version "3.0.1" 329 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 330 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 331 | dependencies: 332 | type-detect "^4.0.0" 333 | 334 | deep-is@~0.1.3: 335 | version "0.1.3" 336 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 337 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 338 | 339 | define-properties@^1.1.2: 340 | version "1.1.3" 341 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 342 | integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== 343 | dependencies: 344 | object-keys "^1.0.12" 345 | 346 | diff@3.5.0: 347 | version "3.5.0" 348 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 349 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 350 | 351 | doctrine@^3.0.0: 352 | version "3.0.0" 353 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 354 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 355 | dependencies: 356 | esutils "^2.0.2" 357 | 358 | emoji-regex@^7.0.1: 359 | version "7.0.3" 360 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 361 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 362 | 363 | emoji-regex@^8.0.0: 364 | version "8.0.0" 365 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 366 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 367 | 368 | es-abstract@^1.5.1: 369 | version "1.13.0" 370 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" 371 | integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== 372 | dependencies: 373 | es-to-primitive "^1.2.0" 374 | function-bind "^1.1.1" 375 | has "^1.0.3" 376 | is-callable "^1.1.4" 377 | is-regex "^1.0.4" 378 | object-keys "^1.0.12" 379 | 380 | es-to-primitive@^1.2.0: 381 | version "1.2.0" 382 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" 383 | integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== 384 | dependencies: 385 | is-callable "^1.1.4" 386 | is-date-object "^1.0.1" 387 | is-symbol "^1.0.2" 388 | 389 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 390 | version "1.0.5" 391 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 392 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 393 | 394 | eslint-config-prettier@^6.15.0: 395 | version "6.15.0" 396 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" 397 | integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== 398 | dependencies: 399 | get-stdin "^6.0.0" 400 | 401 | eslint-plugin-es@^3.0.0: 402 | version "3.0.0" 403 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz#98cb1bc8ab0aa807977855e11ad9d1c9422d014b" 404 | integrity sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng== 405 | dependencies: 406 | eslint-utils "^2.0.0" 407 | regexpp "^3.0.0" 408 | 409 | eslint-plugin-mocha@^6.3.0: 410 | version "6.3.0" 411 | resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz#72bfd06a5c4323e17e30ef41cd726030e8cdb8fd" 412 | integrity sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg== 413 | dependencies: 414 | eslint-utils "^2.0.0" 415 | ramda "^0.27.0" 416 | 417 | eslint-plugin-node@^11.1.0: 418 | version "11.1.0" 419 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" 420 | integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== 421 | dependencies: 422 | eslint-plugin-es "^3.0.0" 423 | eslint-utils "^2.0.0" 424 | ignore "^5.1.1" 425 | minimatch "^3.0.4" 426 | resolve "^1.10.1" 427 | semver "^6.1.0" 428 | 429 | eslint-scope@^4.0.3: 430 | version "4.0.3" 431 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" 432 | integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== 433 | dependencies: 434 | esrecurse "^4.1.0" 435 | estraverse "^4.1.1" 436 | 437 | eslint-scope@^5.0.0: 438 | version "5.0.0" 439 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" 440 | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 441 | dependencies: 442 | esrecurse "^4.1.0" 443 | estraverse "^4.1.1" 444 | 445 | eslint-utils@^1.3.1, eslint-utils@^1.4.3: 446 | version "1.4.3" 447 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" 448 | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 449 | dependencies: 450 | eslint-visitor-keys "^1.1.0" 451 | 452 | eslint-utils@^2.0.0: 453 | version "2.0.0" 454 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" 455 | integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== 456 | dependencies: 457 | eslint-visitor-keys "^1.1.0" 458 | 459 | eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: 460 | version "1.1.0" 461 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" 462 | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 463 | 464 | eslint@^5.10.0: 465 | version "5.16.0" 466 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" 467 | integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== 468 | dependencies: 469 | "@babel/code-frame" "^7.0.0" 470 | ajv "^6.9.1" 471 | chalk "^2.1.0" 472 | cross-spawn "^6.0.5" 473 | debug "^4.0.1" 474 | doctrine "^3.0.0" 475 | eslint-scope "^4.0.3" 476 | eslint-utils "^1.3.1" 477 | eslint-visitor-keys "^1.0.0" 478 | espree "^5.0.1" 479 | esquery "^1.0.1" 480 | esutils "^2.0.2" 481 | file-entry-cache "^5.0.1" 482 | functional-red-black-tree "^1.0.1" 483 | glob "^7.1.2" 484 | globals "^11.7.0" 485 | ignore "^4.0.6" 486 | import-fresh "^3.0.0" 487 | imurmurhash "^0.1.4" 488 | inquirer "^6.2.2" 489 | js-yaml "^3.13.0" 490 | json-stable-stringify-without-jsonify "^1.0.1" 491 | levn "^0.3.0" 492 | lodash "^4.17.11" 493 | minimatch "^3.0.4" 494 | mkdirp "^0.5.1" 495 | natural-compare "^1.4.0" 496 | optionator "^0.8.2" 497 | path-is-inside "^1.0.2" 498 | progress "^2.0.0" 499 | regexpp "^2.0.1" 500 | semver "^5.5.1" 501 | strip-ansi "^4.0.0" 502 | strip-json-comments "^2.0.1" 503 | table "^5.2.3" 504 | text-table "^0.2.0" 505 | 506 | eslint@^6.8.0: 507 | version "6.8.0" 508 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" 509 | integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== 510 | dependencies: 511 | "@babel/code-frame" "^7.0.0" 512 | ajv "^6.10.0" 513 | chalk "^2.1.0" 514 | cross-spawn "^6.0.5" 515 | debug "^4.0.1" 516 | doctrine "^3.0.0" 517 | eslint-scope "^5.0.0" 518 | eslint-utils "^1.4.3" 519 | eslint-visitor-keys "^1.1.0" 520 | espree "^6.1.2" 521 | esquery "^1.0.1" 522 | esutils "^2.0.2" 523 | file-entry-cache "^5.0.1" 524 | functional-red-black-tree "^1.0.1" 525 | glob-parent "^5.0.0" 526 | globals "^12.1.0" 527 | ignore "^4.0.6" 528 | import-fresh "^3.0.0" 529 | imurmurhash "^0.1.4" 530 | inquirer "^7.0.0" 531 | is-glob "^4.0.0" 532 | js-yaml "^3.13.1" 533 | json-stable-stringify-without-jsonify "^1.0.1" 534 | levn "^0.3.0" 535 | lodash "^4.17.14" 536 | minimatch "^3.0.4" 537 | mkdirp "^0.5.1" 538 | natural-compare "^1.4.0" 539 | optionator "^0.8.3" 540 | progress "^2.0.0" 541 | regexpp "^2.0.1" 542 | semver "^6.1.2" 543 | strip-ansi "^5.2.0" 544 | strip-json-comments "^3.0.1" 545 | table "^5.2.3" 546 | text-table "^0.2.0" 547 | v8-compile-cache "^2.0.3" 548 | 549 | espree@^5.0.1: 550 | version "5.0.1" 551 | resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" 552 | integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== 553 | dependencies: 554 | acorn "^6.0.7" 555 | acorn-jsx "^5.0.0" 556 | eslint-visitor-keys "^1.0.0" 557 | 558 | espree@^6.1.2: 559 | version "6.1.2" 560 | resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" 561 | integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA== 562 | dependencies: 563 | acorn "^7.1.0" 564 | acorn-jsx "^5.1.0" 565 | eslint-visitor-keys "^1.1.0" 566 | 567 | esprima@^4.0.0, esprima@~4.0.0: 568 | version "4.0.1" 569 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 570 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 571 | 572 | esquery@^1.0.1: 573 | version "1.0.1" 574 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 575 | integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 576 | dependencies: 577 | estraverse "^4.0.0" 578 | 579 | esrecurse@^4.1.0: 580 | version "4.2.1" 581 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 582 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 583 | dependencies: 584 | estraverse "^4.1.0" 585 | 586 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 587 | version "4.2.0" 588 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 589 | integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= 590 | 591 | esutils@^2.0.2: 592 | version "2.0.2" 593 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 594 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 595 | 596 | external-editor@^3.0.3: 597 | version "3.0.3" 598 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" 599 | integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== 600 | dependencies: 601 | chardet "^0.7.0" 602 | iconv-lite "^0.4.24" 603 | tmp "^0.0.33" 604 | 605 | fast-deep-equal@^2.0.1: 606 | version "2.0.1" 607 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 608 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 609 | 610 | fast-json-stable-stringify@^2.0.0: 611 | version "2.0.0" 612 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 613 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 614 | 615 | fast-levenshtein@~2.0.6: 616 | version "2.0.6" 617 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 618 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 619 | 620 | figures@^2.0.0: 621 | version "2.0.0" 622 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 623 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 624 | dependencies: 625 | escape-string-regexp "^1.0.5" 626 | 627 | figures@^3.0.0: 628 | version "3.1.0" 629 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" 630 | integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== 631 | dependencies: 632 | escape-string-regexp "^1.0.5" 633 | 634 | file-entry-cache@^5.0.1: 635 | version "5.0.1" 636 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" 637 | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 638 | dependencies: 639 | flat-cache "^2.0.1" 640 | 641 | find-up@3.0.0, find-up@^3.0.0: 642 | version "3.0.0" 643 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 644 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 645 | dependencies: 646 | locate-path "^3.0.0" 647 | 648 | flat-cache@^2.0.1: 649 | version "2.0.1" 650 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" 651 | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 652 | dependencies: 653 | flatted "^2.0.0" 654 | rimraf "2.6.3" 655 | write "1.0.3" 656 | 657 | flat@^4.1.0: 658 | version "4.1.0" 659 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 660 | integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== 661 | dependencies: 662 | is-buffer "~2.0.3" 663 | 664 | flatted@^2.0.0: 665 | version "2.0.1" 666 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" 667 | integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== 668 | 669 | fs.realpath@^1.0.0: 670 | version "1.0.0" 671 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 672 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 673 | 674 | function-bind@^1.1.1: 675 | version "1.1.1" 676 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 677 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 678 | 679 | functional-red-black-tree@^1.0.1: 680 | version "1.0.1" 681 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 682 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 683 | 684 | get-caller-file@^2.0.1: 685 | version "2.0.5" 686 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 687 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 688 | 689 | get-func-name@^2.0.0: 690 | version "2.0.0" 691 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 692 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 693 | 694 | get-stdin@^6.0.0: 695 | version "6.0.0" 696 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" 697 | integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 698 | 699 | glob-all@^3.1.0: 700 | version "3.1.0" 701 | resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.1.0.tgz#8913ddfb5ee1ac7812656241b03d5217c64b02ab" 702 | integrity sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs= 703 | dependencies: 704 | glob "^7.0.5" 705 | yargs "~1.2.6" 706 | 707 | glob-parent@^5.0.0: 708 | version "5.0.0" 709 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954" 710 | integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg== 711 | dependencies: 712 | is-glob "^4.0.1" 713 | 714 | glob@7.1.3: 715 | version "7.1.3" 716 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 717 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 718 | dependencies: 719 | fs.realpath "^1.0.0" 720 | inflight "^1.0.4" 721 | inherits "2" 722 | minimatch "^3.0.4" 723 | once "^1.3.0" 724 | path-is-absolute "^1.0.0" 725 | 726 | glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: 727 | version "7.1.4" 728 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 729 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 730 | dependencies: 731 | fs.realpath "^1.0.0" 732 | inflight "^1.0.4" 733 | inherits "2" 734 | minimatch "^3.0.4" 735 | once "^1.3.0" 736 | path-is-absolute "^1.0.0" 737 | 738 | globals@^11.1.0, globals@^11.7.0: 739 | version "11.12.0" 740 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 741 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 742 | 743 | globals@^12.1.0: 744 | version "12.3.0" 745 | resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" 746 | integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== 747 | dependencies: 748 | type-fest "^0.8.1" 749 | 750 | growl@1.10.5: 751 | version "1.10.5" 752 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 753 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 754 | 755 | has-flag@^3.0.0: 756 | version "3.0.0" 757 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 758 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 759 | 760 | has-symbols@^1.0.0: 761 | version "1.0.0" 762 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" 763 | integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= 764 | 765 | has@^1.0.1, has@^1.0.3: 766 | version "1.0.3" 767 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 768 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 769 | dependencies: 770 | function-bind "^1.1.1" 771 | 772 | he@1.2.0: 773 | version "1.2.0" 774 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 775 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 776 | 777 | iconv-lite@^0.4.24: 778 | version "0.4.24" 779 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 780 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 781 | dependencies: 782 | safer-buffer ">= 2.1.2 < 3" 783 | 784 | ignore@^4.0.6: 785 | version "4.0.6" 786 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 787 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 788 | 789 | ignore@^5.1.1: 790 | version "5.1.2" 791 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.2.tgz#e28e584d43ad7e92f96995019cc43b9e1ac49558" 792 | integrity sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ== 793 | 794 | import-fresh@^3.0.0: 795 | version "3.1.0" 796 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" 797 | integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== 798 | dependencies: 799 | parent-module "^1.0.0" 800 | resolve-from "^4.0.0" 801 | 802 | imurmurhash@^0.1.4: 803 | version "0.1.4" 804 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 805 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 806 | 807 | inflight@^1.0.4: 808 | version "1.0.6" 809 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 810 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 811 | dependencies: 812 | once "^1.3.0" 813 | wrappy "1" 814 | 815 | inherits@2: 816 | version "2.0.4" 817 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 818 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 819 | 820 | inquirer@^6.2.2: 821 | version "6.5.0" 822 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" 823 | integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== 824 | dependencies: 825 | ansi-escapes "^3.2.0" 826 | chalk "^2.4.2" 827 | cli-cursor "^2.1.0" 828 | cli-width "^2.0.0" 829 | external-editor "^3.0.3" 830 | figures "^2.0.0" 831 | lodash "^4.17.12" 832 | mute-stream "0.0.7" 833 | run-async "^2.2.0" 834 | rxjs "^6.4.0" 835 | string-width "^2.1.0" 836 | strip-ansi "^5.1.0" 837 | through "^2.3.6" 838 | 839 | inquirer@^7.0.0: 840 | version "7.0.0" 841 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" 842 | integrity sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ== 843 | dependencies: 844 | ansi-escapes "^4.2.1" 845 | chalk "^2.4.2" 846 | cli-cursor "^3.1.0" 847 | cli-width "^2.0.0" 848 | external-editor "^3.0.3" 849 | figures "^3.0.0" 850 | lodash "^4.17.15" 851 | mute-stream "0.0.8" 852 | run-async "^2.2.0" 853 | rxjs "^6.4.0" 854 | string-width "^4.1.0" 855 | strip-ansi "^5.1.0" 856 | through "^2.3.6" 857 | 858 | is-buffer@~2.0.3: 859 | version "2.0.3" 860 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" 861 | integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw== 862 | 863 | is-callable@^1.1.4: 864 | version "1.1.4" 865 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" 866 | integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== 867 | 868 | is-date-object@^1.0.1: 869 | version "1.0.1" 870 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 871 | integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= 872 | 873 | is-extglob@^2.1.1: 874 | version "2.1.1" 875 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 876 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 877 | 878 | is-fullwidth-code-point@^2.0.0: 879 | version "2.0.0" 880 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 881 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 882 | 883 | is-fullwidth-code-point@^3.0.0: 884 | version "3.0.0" 885 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 886 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 887 | 888 | is-glob@^4.0.0, is-glob@^4.0.1: 889 | version "4.0.1" 890 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 891 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 892 | dependencies: 893 | is-extglob "^2.1.1" 894 | 895 | is-promise@^2.1.0: 896 | version "2.1.0" 897 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 898 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 899 | 900 | is-regex@^1.0.4: 901 | version "1.0.4" 902 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 903 | integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= 904 | dependencies: 905 | has "^1.0.1" 906 | 907 | is-symbol@^1.0.2: 908 | version "1.0.2" 909 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" 910 | integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== 911 | dependencies: 912 | has-symbols "^1.0.0" 913 | 914 | isexe@^2.0.0: 915 | version "2.0.0" 916 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 917 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 918 | 919 | js-tokens@^4.0.0: 920 | version "4.0.0" 921 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 922 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 923 | 924 | js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1: 925 | version "3.13.1" 926 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 927 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 928 | dependencies: 929 | argparse "^1.0.7" 930 | esprima "^4.0.0" 931 | 932 | jsesc@^2.5.1: 933 | version "2.5.2" 934 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 935 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 936 | 937 | json-schema-traverse@^0.4.1: 938 | version "0.4.1" 939 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 940 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 941 | 942 | json-stable-stringify-without-jsonify@^1.0.1: 943 | version "1.0.1" 944 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 945 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 946 | 947 | levn@^0.3.0, levn@~0.3.0: 948 | version "0.3.0" 949 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 950 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 951 | dependencies: 952 | prelude-ls "~1.1.2" 953 | type-check "~0.3.2" 954 | 955 | locate-path@^3.0.0: 956 | version "3.0.0" 957 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 958 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 959 | dependencies: 960 | p-locate "^3.0.0" 961 | path-exists "^3.0.0" 962 | 963 | lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15: 964 | version "4.17.21" 965 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 966 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 967 | 968 | log-symbols@2.2.0: 969 | version "2.2.0" 970 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" 971 | integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== 972 | dependencies: 973 | chalk "^2.0.1" 974 | 975 | mimic-fn@^1.0.0: 976 | version "1.2.0" 977 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 978 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 979 | 980 | mimic-fn@^2.1.0: 981 | version "2.1.0" 982 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 983 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 984 | 985 | minimatch@3.0.4, minimatch@^3.0.4: 986 | version "3.0.4" 987 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 988 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 989 | dependencies: 990 | brace-expansion "^1.1.7" 991 | 992 | minimist@0.0.8: 993 | version "0.0.8" 994 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 995 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 996 | 997 | minimist@^0.1.0: 998 | version "0.1.0" 999 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" 1000 | integrity sha1-md9lelJXTCHJBXSX33QnkLK0wN4= 1001 | 1002 | mkdirp@0.5.1, mkdirp@^0.5.1: 1003 | version "0.5.1" 1004 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1005 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 1006 | dependencies: 1007 | minimist "0.0.8" 1008 | 1009 | mocha-eslint@^5.0.0: 1010 | version "5.0.0" 1011 | resolved "https://registry.yarnpkg.com/mocha-eslint/-/mocha-eslint-5.0.0.tgz#07b09ac2f32bcfb9b9177fce13098147e0bd8ce9" 1012 | integrity sha512-K6ewxXXVtVQA+/iIgXP5AQnNus+TxkjB/d3lK1j8Cj3Oc282As7G9j7o5WXAF+cCsGD9t4apS6hc9GqQtEbbVA== 1013 | dependencies: 1014 | chalk "^2.4.1" 1015 | eslint "^5.10.0" 1016 | glob-all "^3.1.0" 1017 | replaceall "^0.1.6" 1018 | 1019 | mocha@^6.2.2: 1020 | version "6.2.2" 1021 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20" 1022 | integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A== 1023 | dependencies: 1024 | ansi-colors "3.2.3" 1025 | browser-stdout "1.3.1" 1026 | debug "3.2.6" 1027 | diff "3.5.0" 1028 | escape-string-regexp "1.0.5" 1029 | find-up "3.0.0" 1030 | glob "7.1.3" 1031 | growl "1.10.5" 1032 | he "1.2.0" 1033 | js-yaml "3.13.1" 1034 | log-symbols "2.2.0" 1035 | minimatch "3.0.4" 1036 | mkdirp "0.5.1" 1037 | ms "2.1.1" 1038 | node-environment-flags "1.0.5" 1039 | object.assign "4.1.0" 1040 | strip-json-comments "2.0.1" 1041 | supports-color "6.0.0" 1042 | which "1.3.1" 1043 | wide-align "1.1.3" 1044 | yargs "13.3.0" 1045 | yargs-parser "13.1.1" 1046 | yargs-unparser "1.6.0" 1047 | 1048 | ms@2.1.1: 1049 | version "2.1.1" 1050 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1051 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1052 | 1053 | ms@^2.1.1: 1054 | version "2.1.2" 1055 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1056 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1057 | 1058 | mute-stream@0.0.7: 1059 | version "0.0.7" 1060 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1061 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 1062 | 1063 | mute-stream@0.0.8: 1064 | version "0.0.8" 1065 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1066 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1067 | 1068 | natural-compare@^1.4.0: 1069 | version "1.4.0" 1070 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1071 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1072 | 1073 | nice-try@^1.0.4: 1074 | version "1.0.5" 1075 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 1076 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1077 | 1078 | node-environment-flags@1.0.5: 1079 | version "1.0.5" 1080 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" 1081 | integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== 1082 | dependencies: 1083 | object.getownpropertydescriptors "^2.0.3" 1084 | semver "^5.7.0" 1085 | 1086 | object-keys@^1.0.11, object-keys@^1.0.12: 1087 | version "1.1.1" 1088 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1089 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1090 | 1091 | object.assign@4.1.0: 1092 | version "4.1.0" 1093 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1094 | integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== 1095 | dependencies: 1096 | define-properties "^1.1.2" 1097 | function-bind "^1.1.1" 1098 | has-symbols "^1.0.0" 1099 | object-keys "^1.0.11" 1100 | 1101 | object.getownpropertydescriptors@^2.0.3: 1102 | version "2.0.3" 1103 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" 1104 | integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= 1105 | dependencies: 1106 | define-properties "^1.1.2" 1107 | es-abstract "^1.5.1" 1108 | 1109 | once@^1.3.0: 1110 | version "1.4.0" 1111 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1112 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1113 | dependencies: 1114 | wrappy "1" 1115 | 1116 | onetime@^2.0.0: 1117 | version "2.0.1" 1118 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1119 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 1120 | dependencies: 1121 | mimic-fn "^1.0.0" 1122 | 1123 | onetime@^5.1.0: 1124 | version "5.1.0" 1125 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" 1126 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1127 | dependencies: 1128 | mimic-fn "^2.1.0" 1129 | 1130 | optionator@^0.8.2, optionator@^0.8.3: 1131 | version "0.8.3" 1132 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" 1133 | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1134 | dependencies: 1135 | deep-is "~0.1.3" 1136 | fast-levenshtein "~2.0.6" 1137 | levn "~0.3.0" 1138 | prelude-ls "~1.1.2" 1139 | type-check "~0.3.2" 1140 | word-wrap "~1.2.3" 1141 | 1142 | os-tmpdir@~1.0.2: 1143 | version "1.0.2" 1144 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1145 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1146 | 1147 | p-limit@^2.0.0: 1148 | version "2.2.0" 1149 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" 1150 | integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== 1151 | dependencies: 1152 | p-try "^2.0.0" 1153 | 1154 | p-locate@^3.0.0: 1155 | version "3.0.0" 1156 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1157 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1158 | dependencies: 1159 | p-limit "^2.0.0" 1160 | 1161 | p-try@^2.0.0: 1162 | version "2.2.0" 1163 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1164 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1165 | 1166 | parent-module@^1.0.0: 1167 | version "1.0.1" 1168 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1169 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1170 | dependencies: 1171 | callsites "^3.0.0" 1172 | 1173 | path-exists@^3.0.0: 1174 | version "3.0.0" 1175 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1176 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1177 | 1178 | path-is-absolute@^1.0.0: 1179 | version "1.0.1" 1180 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1181 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1182 | 1183 | path-is-inside@^1.0.2: 1184 | version "1.0.2" 1185 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1186 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 1187 | 1188 | path-key@^2.0.1: 1189 | version "2.0.1" 1190 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1191 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1192 | 1193 | path-parse@^1.0.6: 1194 | version "1.0.7" 1195 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1196 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1197 | 1198 | pathval@^1.1.1: 1199 | version "1.1.1" 1200 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1201 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1202 | 1203 | prelude-ls@~1.1.2: 1204 | version "1.1.2" 1205 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1206 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1207 | 1208 | prettier@^1.19.1: 1209 | version "1.19.1" 1210 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" 1211 | integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== 1212 | 1213 | private@^0.1.8: 1214 | version "0.1.8" 1215 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 1216 | integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== 1217 | 1218 | progress@^2.0.0: 1219 | version "2.0.3" 1220 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 1221 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1222 | 1223 | punycode@^2.1.0: 1224 | version "2.1.1" 1225 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1226 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1227 | 1228 | ramda@^0.27.0: 1229 | version "0.27.0" 1230 | resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.0.tgz#915dc29865c0800bf3f69b8fd6c279898b59de43" 1231 | integrity sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA== 1232 | 1233 | recast@^0.19.1: 1234 | version "0.19.1" 1235 | resolved "https://registry.yarnpkg.com/recast/-/recast-0.19.1.tgz#555f3612a5a10c9f44b9a923875c51ff775de6c8" 1236 | integrity sha512-8FCjrBxjeEU2O6I+2hyHyBFH1siJbMBLwIRvVr1T3FD2cL754sOaJDsJ/8h3xYltasbJ8jqWRIhMuDGBSiSbjw== 1237 | dependencies: 1238 | ast-types "0.13.3" 1239 | esprima "~4.0.0" 1240 | private "^0.1.8" 1241 | source-map "~0.6.1" 1242 | 1243 | regexpp@^2.0.1: 1244 | version "2.0.1" 1245 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 1246 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1247 | 1248 | regexpp@^3.0.0: 1249 | version "3.0.0" 1250 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" 1251 | integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== 1252 | 1253 | replaceall@^0.1.6: 1254 | version "0.1.6" 1255 | resolved "https://registry.yarnpkg.com/replaceall/-/replaceall-0.1.6.tgz#81d81ac7aeb72d7f5c4942adf2697a3220688d8e" 1256 | integrity sha1-gdgax663LX9cSUKt8ml6MiBojY4= 1257 | 1258 | require-directory@^2.1.1: 1259 | version "2.1.1" 1260 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1261 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1262 | 1263 | require-main-filename@^2.0.0: 1264 | version "2.0.0" 1265 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1266 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1267 | 1268 | resolve-from@^4.0.0: 1269 | version "4.0.0" 1270 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1271 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1272 | 1273 | resolve@^1.10.1: 1274 | version "1.11.1" 1275 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" 1276 | integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== 1277 | dependencies: 1278 | path-parse "^1.0.6" 1279 | 1280 | restore-cursor@^2.0.0: 1281 | version "2.0.0" 1282 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1283 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 1284 | dependencies: 1285 | onetime "^2.0.0" 1286 | signal-exit "^3.0.2" 1287 | 1288 | restore-cursor@^3.1.0: 1289 | version "3.1.0" 1290 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" 1291 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1292 | dependencies: 1293 | onetime "^5.1.0" 1294 | signal-exit "^3.0.2" 1295 | 1296 | rimraf@2.6.3: 1297 | version "2.6.3" 1298 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 1299 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1300 | dependencies: 1301 | glob "^7.1.3" 1302 | 1303 | run-async@^2.2.0: 1304 | version "2.3.0" 1305 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1306 | integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= 1307 | dependencies: 1308 | is-promise "^2.1.0" 1309 | 1310 | rxjs@^6.4.0: 1311 | version "6.5.2" 1312 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.2.tgz#2e35ce815cd46d84d02a209fb4e5921e051dbec7" 1313 | integrity sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg== 1314 | dependencies: 1315 | tslib "^1.9.0" 1316 | 1317 | "safer-buffer@>= 2.1.2 < 3": 1318 | version "2.1.2" 1319 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1320 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1321 | 1322 | semver@^5.5.0, semver@^5.5.1, semver@^5.7.0: 1323 | version "5.7.0" 1324 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 1325 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 1326 | 1327 | semver@^6.1.0, semver@^6.1.2: 1328 | version "6.2.0" 1329 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" 1330 | integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== 1331 | 1332 | set-blocking@^2.0.0: 1333 | version "2.0.0" 1334 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1335 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1336 | 1337 | shebang-command@^1.2.0: 1338 | version "1.2.0" 1339 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1340 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1341 | dependencies: 1342 | shebang-regex "^1.0.0" 1343 | 1344 | shebang-regex@^1.0.0: 1345 | version "1.0.0" 1346 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1347 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1348 | 1349 | signal-exit@^3.0.2: 1350 | version "3.0.2" 1351 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1352 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 1353 | 1354 | slice-ansi@^2.1.0: 1355 | version "2.1.0" 1356 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" 1357 | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1358 | dependencies: 1359 | ansi-styles "^3.2.0" 1360 | astral-regex "^1.0.0" 1361 | is-fullwidth-code-point "^2.0.0" 1362 | 1363 | source-map@^0.5.0: 1364 | version "0.5.7" 1365 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1366 | integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= 1367 | 1368 | source-map@~0.6.1: 1369 | version "0.6.1" 1370 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1371 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1372 | 1373 | sprintf-js@~1.0.2: 1374 | version "1.0.3" 1375 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1376 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1377 | 1378 | "string-width@^1.0.2 || 2", string-width@^2.1.0: 1379 | version "2.1.1" 1380 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1381 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1382 | dependencies: 1383 | is-fullwidth-code-point "^2.0.0" 1384 | strip-ansi "^4.0.0" 1385 | 1386 | string-width@^3.0.0, string-width@^3.1.0: 1387 | version "3.1.0" 1388 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1389 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1390 | dependencies: 1391 | emoji-regex "^7.0.1" 1392 | is-fullwidth-code-point "^2.0.0" 1393 | strip-ansi "^5.1.0" 1394 | 1395 | string-width@^4.1.0: 1396 | version "4.1.0" 1397 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.1.0.tgz#ba846d1daa97c3c596155308063e075ed1c99aff" 1398 | integrity sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ== 1399 | dependencies: 1400 | emoji-regex "^8.0.0" 1401 | is-fullwidth-code-point "^3.0.0" 1402 | strip-ansi "^5.2.0" 1403 | 1404 | strip-ansi@^4.0.0: 1405 | version "4.0.0" 1406 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1407 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1408 | dependencies: 1409 | ansi-regex "^3.0.0" 1410 | 1411 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1412 | version "5.2.0" 1413 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1414 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1415 | dependencies: 1416 | ansi-regex "^4.1.0" 1417 | 1418 | strip-json-comments@2.0.1, strip-json-comments@^2.0.1: 1419 | version "2.0.1" 1420 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1421 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1422 | 1423 | strip-json-comments@^3.0.1: 1424 | version "3.0.1" 1425 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" 1426 | integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 1427 | 1428 | supports-color@6.0.0: 1429 | version "6.0.0" 1430 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 1431 | integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== 1432 | dependencies: 1433 | has-flag "^3.0.0" 1434 | 1435 | supports-color@^5.3.0: 1436 | version "5.5.0" 1437 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1438 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1439 | dependencies: 1440 | has-flag "^3.0.0" 1441 | 1442 | table@^5.2.3: 1443 | version "5.4.1" 1444 | resolved "https://registry.yarnpkg.com/table/-/table-5.4.1.tgz#0691ae2ebe8259858efb63e550b6d5f9300171e8" 1445 | integrity sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w== 1446 | dependencies: 1447 | ajv "^6.9.1" 1448 | lodash "^4.17.11" 1449 | slice-ansi "^2.1.0" 1450 | string-width "^3.0.0" 1451 | 1452 | text-table@^0.2.0: 1453 | version "0.2.0" 1454 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1455 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1456 | 1457 | through@^2.3.6: 1458 | version "2.3.8" 1459 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1460 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1461 | 1462 | tmp@^0.0.33: 1463 | version "0.0.33" 1464 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 1465 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1466 | dependencies: 1467 | os-tmpdir "~1.0.2" 1468 | 1469 | to-fast-properties@^2.0.0: 1470 | version "2.0.0" 1471 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1472 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 1473 | 1474 | tslib@^1.9.0: 1475 | version "1.10.0" 1476 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 1477 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 1478 | 1479 | type-check@~0.3.2: 1480 | version "0.3.2" 1481 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 1482 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1483 | dependencies: 1484 | prelude-ls "~1.1.2" 1485 | 1486 | type-detect@^4.0.0, type-detect@^4.0.5: 1487 | version "4.0.8" 1488 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1489 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1490 | 1491 | type-fest@^0.5.2: 1492 | version "0.5.2" 1493 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" 1494 | integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== 1495 | 1496 | type-fest@^0.8.1: 1497 | version "0.8.1" 1498 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1499 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1500 | 1501 | uri-js@^4.2.2: 1502 | version "4.2.2" 1503 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1504 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1505 | dependencies: 1506 | punycode "^2.1.0" 1507 | 1508 | v8-compile-cache@^2.0.3: 1509 | version "2.0.3" 1510 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" 1511 | integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== 1512 | 1513 | which-module@^2.0.0: 1514 | version "2.0.0" 1515 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1516 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1517 | 1518 | which@1.3.1, which@^1.2.9: 1519 | version "1.3.1" 1520 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1521 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1522 | dependencies: 1523 | isexe "^2.0.0" 1524 | 1525 | wide-align@1.1.3: 1526 | version "1.1.3" 1527 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1528 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1529 | dependencies: 1530 | string-width "^1.0.2 || 2" 1531 | 1532 | word-wrap@~1.2.3: 1533 | version "1.2.3" 1534 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 1535 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1536 | 1537 | wrap-ansi@^5.1.0: 1538 | version "5.1.0" 1539 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1540 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1541 | dependencies: 1542 | ansi-styles "^3.2.0" 1543 | string-width "^3.0.0" 1544 | strip-ansi "^5.0.0" 1545 | 1546 | wrappy@1: 1547 | version "1.0.2" 1548 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1549 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1550 | 1551 | write@1.0.3: 1552 | version "1.0.3" 1553 | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" 1554 | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1555 | dependencies: 1556 | mkdirp "^0.5.1" 1557 | 1558 | y18n@^4.0.0: 1559 | version "4.0.1" 1560 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" 1561 | integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== 1562 | 1563 | yargs-parser@13.1.1, yargs-parser@^13.1.1: 1564 | version "13.1.1" 1565 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" 1566 | integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== 1567 | dependencies: 1568 | camelcase "^5.0.0" 1569 | decamelize "^1.2.0" 1570 | 1571 | yargs-unparser@1.6.0: 1572 | version "1.6.0" 1573 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 1574 | integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== 1575 | dependencies: 1576 | flat "^4.1.0" 1577 | lodash "^4.17.15" 1578 | yargs "^13.3.0" 1579 | 1580 | yargs@13.3.0, yargs@^13.3.0: 1581 | version "13.3.0" 1582 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" 1583 | integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== 1584 | dependencies: 1585 | cliui "^5.0.0" 1586 | find-up "^3.0.0" 1587 | get-caller-file "^2.0.1" 1588 | require-directory "^2.1.1" 1589 | require-main-filename "^2.0.0" 1590 | set-blocking "^2.0.0" 1591 | string-width "^3.0.0" 1592 | which-module "^2.0.0" 1593 | y18n "^4.0.0" 1594 | yargs-parser "^13.1.1" 1595 | 1596 | yargs@~1.2.6: 1597 | version "1.2.6" 1598 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" 1599 | integrity sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s= 1600 | dependencies: 1601 | minimist "^0.1.0" 1602 | --------------------------------------------------------------------------------