├── .gitignore ├── .npmignore ├── .travis.yml ├── README.md ├── example ├── .babelrc ├── controllers │ ├── api │ │ └── posts.js │ └── home.js ├── middleware │ └── oauth.js ├── package.json ├── server.js └── yarn.lock ├── package.json ├── src ├── connect.ts ├── connect │ └── transfer.ts ├── models │ ├── controller.ts │ ├── group_config.ts │ ├── middleware.ts │ ├── request_with_torch.ts │ └── route_config.ts ├── route.ts ├── router.ts ├── routes.ts ├── torch.ts └── util │ ├── constrain_path.ts │ └── trim.ts ├── tests └── torch.test.ts ├── tsconfig.json ├── tsconfig.test.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | build 4 | npm-debug.log 5 | /tests/**/*.js 6 | /tests/**/*.js.map 7 | /src/**/*.js 8 | /src/**/*.js.map 9 | /express-torch.d.ts 10 | /coverage/ 11 | /.nyc_output/ 12 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | tests/ 3 | typings/ 4 | .idea 5 | node_modules 6 | example 7 | npm-debug.log 8 | .babelrc 9 | .travis.yml 10 | build/**/*.ts 11 | tsconfig.json 12 | typings.json 13 | coverage 14 | .nyc_output 15 | 16 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | cache: 3 | directories: 4 | - $HOME/.npm 5 | - $HOME/.yarn-cache 6 | - node_modules 7 | node_js: 8 | - "6" 9 | before_install: 10 | - time npm i -g yarn --cache-min 999999999 11 | install: 12 | - yarn 13 | script: 14 | - npm test -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Express Torch 2 | ===== 3 | 4 | [![Build Status](https://travis-ci.org/JBlaak/Express-Torch.svg?branch=master)](https://travis-ci.org/JBlaak/Express-Torch) 5 | 6 | Expressive and maintainable routes for Express.js. 7 | 8 | Running the example 9 | ----- 10 | 11 | The project includes a simple example rendering a `/` and `/api/posts` endpoint, 12 | you can set it up as follows: 13 | 14 | ```bash 15 | $ cd ./example 16 | $ yarn 17 | $ yarn start 18 | ``` 19 | 20 | Now visit `http://localhost:3000` and take a look at `server.js`! 21 | 22 | Usage 23 | ----- 24 | 25 | __Basic usage__ 26 | 27 | You pass your Express app to Torch, and a callback in which you can 28 | specify your routes. 29 | 30 | ```js 31 | import Express from 'express'; 32 | import Torch from 'express-torch'; 33 | import HomeController from './controllers/home'; 34 | 35 | const app = Express(); 36 | 37 | Torch(app, (router) => { 38 | router.get('/', HomeController.index); 39 | }); 40 | 41 | //... your other Express logic 42 | 43 | app.listen(3000); 44 | ``` 45 | 46 | __Grouping__ 47 | 48 | This is where Torch shines, you can register a bunch of routes 49 | that require all parameters of the groups above, such as a `prefix` for 50 | your `/api` routes. 51 | 52 | ```js 53 | import Express from 'express'; 54 | import Torch from 'express-torch'; 55 | import HomeController from './controllers/home'; 56 | 57 | const app = Express(); 58 | 59 | Torch(app, (router) => { 60 | router.get('/', HomeController.index); 61 | router.group({prefix: 'api'}, (router) => { 62 | router.get('/posts', HomeController.index);// will evaluate to /api/posts 63 | router.get('/posts/:id', HomeController.show);// will evaluate to /api/posts/:id 64 | }); 65 | }); 66 | 67 | //... your other Express logic 68 | 69 | app.listen(3000); 70 | ``` 71 | 72 | __Middleware__ 73 | 74 | Groups have another advantage, you can apply regular Express middleware to them, 75 | so that they stack together without you having to specify them per route 76 | 77 | ```js 78 | import Express from 'express'; 79 | import Torch from 'express-torch'; 80 | import HomeController from './controllers/home'; 81 | 82 | const app = Express(); 83 | 84 | Torch(app, (router) => { 85 | router.group({middlware: [Cookies, Session]}, (router) => { 86 | router.get('/', HomeController.index);// Cookies > Session 87 | router.group({middleware: [Throttle]}, (router) => { 88 | router.get('/posts', HomeController.index);// Cookies > Session > Throttle 89 | router.group({middleware: [OAuth, Policy('manage-posts')]}, (router) => { 90 | router.get('/posts/:id', HomeController.show);// Cookies > Session > Throttle > OAuth > Policy('manage-posts') 91 | }); 92 | }); 93 | }); 94 | 95 | //... your other Express logic 96 | 97 | app.listen(3000); 98 | ``` 99 | 100 | if you want, you can still apply middleware to a single route 101 | 102 | ```js 103 | import Express from 'express'; 104 | import Torch from 'express-torch'; 105 | import HomeController from './controllers/home'; 106 | 107 | const app = Express(); 108 | 109 | Torch(app, (router) => { 110 | router.get('/', {, 111 | middleware: [Auth], 112 | controller: HomeController.index 113 | }); 114 | }); 115 | 116 | //... your other Express logic 117 | 118 | app.listen(3000); 119 | ``` 120 | 121 | __Naming__ 122 | 123 | Since urls can be subject to your client's requests you don't want to spread 124 | them all around your application as if they were static. Torch allows you to 125 | add a mapping so that some `name` will map to a path. 126 | 127 | ```js 128 | import Express from 'express'; 129 | import Torch from 'express-torch'; 130 | import PostsController from './controllers/posts'; 131 | 132 | const app = Express(); 133 | 134 | const routes = Torch(app, (router) => { 135 | router.group({prefix: '/api'}, function(router) { 136 | router.get('/posts/:id', {, 137 | name: 'api.posts.show', 138 | controller: PostsController.show 139 | }); 140 | }); 141 | }); 142 | 143 | routes.named('api.posts.show', { id: 123 });// will evaluate to /api/posts/123 144 | 145 | //... your other Express logic 146 | 147 | app.listen(3000); 148 | 149 | /**** in ./controllers/posts.js ****/ 150 | 151 | { 152 | index: (req, res) => { 153 | req.routes.named('api.posts.show', {id: 123}) 154 | } 155 | } 156 | ``` 157 | 158 | __Constraints__ 159 | 160 | Most of the time we want to constrain our routes their variables, for example an `:id` should in some applications only match a number. Express allows us to use regex inside a route path but those make the route look bloated and hard to read. To still be able to constrain our routes but still keep them readable Torch allows us to define the constraints in an extra method. 161 | 162 | ```js 163 | import Express from 'express'; 164 | import Torch from 'express-torch'; 165 | import PostsController from './controllers/posts'; 166 | 167 | const app = Express(); 168 | 169 | const routes = Torch(app, (router) => { 170 | router.group({prefix: '/api'}, function(router) { 171 | router.get('/posts/:id', PostsController.show).where({'id', '(\\d+)'}); // will evaluate to /api/posts/:id(\\d+) 172 | }); 173 | }); 174 | 175 | //... your other Express logic 176 | 177 | app.listen(3000); 178 | ``` -------------------------------------------------------------------------------- /example/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "es2015" 4 | ] 5 | } -------------------------------------------------------------------------------- /example/controllers/api/posts.js: -------------------------------------------------------------------------------- 1 | export default { 2 | index: (req, res) => { 3 | res.json([{ 4 | id: 1, 5 | content: 'Some story' 6 | }]); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /example/controllers/home.js: -------------------------------------------------------------------------------- 1 | export default { 2 | index: (req, res) => { 3 | res.send('

Hi

'); 4 | } 5 | } -------------------------------------------------------------------------------- /example/middleware/oauth.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a basic Express middleware 3 | * @param req 4 | * @param res 5 | * @param next 6 | */ 7 | export default function (req, res, next) { 8 | console.log('Hi we\'re checking the authorization header'); 9 | 10 | next(); 11 | } -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "torch-example", 3 | "version": "0.1.6", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "start": "cd .. && yarn && npm run-script build && cd ./example && babel-node server.js" 8 | }, 9 | "dependencies": { 10 | "babel-cli": "^6.18.0", 11 | "babel-preset-es2015": "^6.18.0", 12 | "express": "^4.14.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /example/server.js: -------------------------------------------------------------------------------- 1 | import Express from 'express'; 2 | import Torch from '../build/torch' 3 | 4 | import OAuth from './middleware/oauth'; 5 | 6 | import HomeController from './controllers/home'; 7 | import ApiPostsController from './controllers/api/posts'; 8 | 9 | const app = Express(); 10 | 11 | Torch(app, (router) => { 12 | 13 | router.get('/', HomeController.index); 14 | 15 | router.group( 16 | { 17 | 'prefix': 'api', 18 | 'middleware': [OAuth] 19 | }, 20 | (router) => { 21 | 22 | router.get('posts', ApiPostsController.index); 23 | 24 | } 25 | ); 26 | 27 | }); 28 | 29 | console.log('Started listening on port 3000'); 30 | app.listen(3000); 31 | -------------------------------------------------------------------------------- /example/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | abbrev@1: 4 | version "1.0.9" 5 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" 6 | 7 | accepts@~1.3.3: 8 | version "1.3.3" 9 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 10 | dependencies: 11 | mime-types "~2.1.11" 12 | negotiator "0.6.1" 13 | 14 | ansi-regex@^2.0.0: 15 | version "2.0.0" 16 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 17 | 18 | ansi-styles@^2.2.1: 19 | version "2.2.1" 20 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 21 | 22 | anymatch@^1.3.0: 23 | version "1.3.0" 24 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 25 | dependencies: 26 | arrify "^1.0.0" 27 | micromatch "^2.1.5" 28 | 29 | aproba@^1.0.3: 30 | version "1.0.4" 31 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" 32 | 33 | are-we-there-yet@~1.1.2: 34 | version "1.1.2" 35 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 36 | dependencies: 37 | delegates "^1.0.0" 38 | readable-stream "^2.0.0 || ^1.1.13" 39 | 40 | arr-diff@^2.0.0: 41 | version "2.0.0" 42 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 43 | dependencies: 44 | arr-flatten "^1.0.1" 45 | 46 | arr-flatten@^1.0.1: 47 | version "1.0.1" 48 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 49 | 50 | array-flatten@1.1.1: 51 | version "1.1.1" 52 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 53 | 54 | array-unique@^0.2.1: 55 | version "0.2.1" 56 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 57 | 58 | arrify@^1.0.0: 59 | version "1.0.1" 60 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 61 | 62 | asn1@~0.2.3: 63 | version "0.2.3" 64 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 65 | 66 | assert-plus@^0.2.0: 67 | version "0.2.0" 68 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 69 | 70 | assert-plus@^1.0.0: 71 | version "1.0.0" 72 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 73 | 74 | async-each@^1.0.0: 75 | version "1.0.1" 76 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 77 | 78 | asynckit@^0.4.0: 79 | version "0.4.0" 80 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 81 | 82 | aws-sign2@~0.6.0: 83 | version "0.6.0" 84 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 85 | 86 | aws4@^1.2.1: 87 | version "1.5.0" 88 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" 89 | 90 | babel-cli: 91 | version "6.18.0" 92 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.18.0.tgz#92117f341add9dead90f6fa7d0a97c0cc08ec186" 93 | dependencies: 94 | babel-core "^6.18.0" 95 | babel-polyfill "^6.16.0" 96 | babel-register "^6.18.0" 97 | babel-runtime "^6.9.0" 98 | commander "^2.8.1" 99 | convert-source-map "^1.1.0" 100 | fs-readdir-recursive "^1.0.0" 101 | glob "^5.0.5" 102 | lodash "^4.2.0" 103 | output-file-sync "^1.1.0" 104 | path-is-absolute "^1.0.0" 105 | slash "^1.0.0" 106 | source-map "^0.5.0" 107 | v8flags "^2.0.10" 108 | optionalDependencies: 109 | chokidar "^1.0.0" 110 | 111 | babel-code-frame@^6.16.0: 112 | version "6.16.0" 113 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" 114 | dependencies: 115 | chalk "^1.1.0" 116 | esutils "^2.0.2" 117 | js-tokens "^2.0.0" 118 | 119 | babel-core@^6.18.0: 120 | version "6.18.0" 121 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.0.tgz#bb5ce9bc0a956e6e94e2f12d597abb3b0b330deb" 122 | dependencies: 123 | babel-code-frame "^6.16.0" 124 | babel-generator "^6.18.0" 125 | babel-helpers "^6.16.0" 126 | babel-messages "^6.8.0" 127 | babel-register "^6.18.0" 128 | babel-runtime "^6.9.1" 129 | babel-template "^6.16.0" 130 | babel-traverse "^6.18.0" 131 | babel-types "^6.18.0" 132 | babylon "^6.11.0" 133 | convert-source-map "^1.1.0" 134 | debug "^2.1.1" 135 | json5 "^0.5.0" 136 | lodash "^4.2.0" 137 | minimatch "^3.0.2" 138 | path-is-absolute "^1.0.0" 139 | private "^0.1.6" 140 | slash "^1.0.0" 141 | source-map "^0.5.0" 142 | 143 | babel-generator@^6.18.0: 144 | version "6.18.0" 145 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" 146 | dependencies: 147 | babel-messages "^6.8.0" 148 | babel-runtime "^6.9.0" 149 | babel-types "^6.18.0" 150 | detect-indent "^4.0.0" 151 | jsesc "^1.3.0" 152 | lodash "^4.2.0" 153 | source-map "^0.5.0" 154 | 155 | babel-helper-call-delegate@^6.18.0: 156 | version "6.18.0" 157 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" 158 | dependencies: 159 | babel-helper-hoist-variables "^6.18.0" 160 | babel-runtime "^6.0.0" 161 | babel-traverse "^6.18.0" 162 | babel-types "^6.18.0" 163 | 164 | babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: 165 | version "6.18.0" 166 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" 167 | dependencies: 168 | babel-helper-function-name "^6.18.0" 169 | babel-runtime "^6.9.0" 170 | babel-types "^6.18.0" 171 | lodash "^4.2.0" 172 | 173 | babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: 174 | version "6.18.0" 175 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" 176 | dependencies: 177 | babel-helper-get-function-arity "^6.18.0" 178 | babel-runtime "^6.0.0" 179 | babel-template "^6.8.0" 180 | babel-traverse "^6.18.0" 181 | babel-types "^6.18.0" 182 | 183 | babel-helper-get-function-arity@^6.18.0: 184 | version "6.18.0" 185 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" 186 | dependencies: 187 | babel-runtime "^6.0.0" 188 | babel-types "^6.18.0" 189 | 190 | babel-helper-hoist-variables@^6.18.0: 191 | version "6.18.0" 192 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" 193 | dependencies: 194 | babel-runtime "^6.0.0" 195 | babel-types "^6.18.0" 196 | 197 | babel-helper-optimise-call-expression@^6.18.0: 198 | version "6.18.0" 199 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" 200 | dependencies: 201 | babel-runtime "^6.0.0" 202 | babel-types "^6.18.0" 203 | 204 | babel-helper-regex@^6.8.0: 205 | version "6.18.0" 206 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" 207 | dependencies: 208 | babel-runtime "^6.9.0" 209 | babel-types "^6.18.0" 210 | lodash "^4.2.0" 211 | 212 | babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: 213 | version "6.18.0" 214 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" 215 | dependencies: 216 | babel-helper-optimise-call-expression "^6.18.0" 217 | babel-messages "^6.8.0" 218 | babel-runtime "^6.0.0" 219 | babel-template "^6.16.0" 220 | babel-traverse "^6.18.0" 221 | babel-types "^6.18.0" 222 | 223 | babel-helpers@^6.16.0: 224 | version "6.16.0" 225 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" 226 | dependencies: 227 | babel-runtime "^6.0.0" 228 | babel-template "^6.16.0" 229 | 230 | babel-messages@^6.8.0: 231 | version "6.8.0" 232 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" 233 | dependencies: 234 | babel-runtime "^6.0.0" 235 | 236 | babel-plugin-check-es2015-constants@^6.3.13: 237 | version "6.8.0" 238 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" 239 | dependencies: 240 | babel-runtime "^6.0.0" 241 | 242 | babel-plugin-transform-es2015-arrow-functions@^6.3.13: 243 | version "6.8.0" 244 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" 245 | dependencies: 246 | babel-runtime "^6.0.0" 247 | 248 | babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: 249 | version "6.8.0" 250 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" 251 | dependencies: 252 | babel-runtime "^6.0.0" 253 | 254 | babel-plugin-transform-es2015-block-scoping@^6.18.0: 255 | version "6.18.0" 256 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" 257 | dependencies: 258 | babel-runtime "^6.9.0" 259 | babel-template "^6.15.0" 260 | babel-traverse "^6.18.0" 261 | babel-types "^6.18.0" 262 | lodash "^4.2.0" 263 | 264 | babel-plugin-transform-es2015-classes@^6.18.0: 265 | version "6.18.0" 266 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" 267 | dependencies: 268 | babel-helper-define-map "^6.18.0" 269 | babel-helper-function-name "^6.18.0" 270 | babel-helper-optimise-call-expression "^6.18.0" 271 | babel-helper-replace-supers "^6.18.0" 272 | babel-messages "^6.8.0" 273 | babel-runtime "^6.9.0" 274 | babel-template "^6.14.0" 275 | babel-traverse "^6.18.0" 276 | babel-types "^6.18.0" 277 | 278 | babel-plugin-transform-es2015-computed-properties@^6.3.13: 279 | version "6.8.0" 280 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" 281 | dependencies: 282 | babel-helper-define-map "^6.8.0" 283 | babel-runtime "^6.0.0" 284 | babel-template "^6.8.0" 285 | 286 | babel-plugin-transform-es2015-destructuring@^6.18.0: 287 | version "6.18.0" 288 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.18.0.tgz#a08fb89415ab82058649558bedb7bf8dafa76ba5" 289 | dependencies: 290 | babel-runtime "^6.9.0" 291 | 292 | babel-plugin-transform-es2015-duplicate-keys@^6.6.0: 293 | version "6.8.0" 294 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" 295 | dependencies: 296 | babel-runtime "^6.0.0" 297 | babel-types "^6.8.0" 298 | 299 | babel-plugin-transform-es2015-for-of@^6.18.0: 300 | version "6.18.0" 301 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" 302 | dependencies: 303 | babel-runtime "^6.0.0" 304 | 305 | babel-plugin-transform-es2015-function-name@^6.9.0: 306 | version "6.9.0" 307 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" 308 | dependencies: 309 | babel-helper-function-name "^6.8.0" 310 | babel-runtime "^6.9.0" 311 | babel-types "^6.9.0" 312 | 313 | babel-plugin-transform-es2015-literals@^6.3.13: 314 | version "6.8.0" 315 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" 316 | dependencies: 317 | babel-runtime "^6.0.0" 318 | 319 | babel-plugin-transform-es2015-modules-amd@^6.18.0: 320 | version "6.18.0" 321 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" 322 | dependencies: 323 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 324 | babel-runtime "^6.0.0" 325 | babel-template "^6.8.0" 326 | 327 | babel-plugin-transform-es2015-modules-commonjs@^6.18.0: 328 | version "6.18.0" 329 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" 330 | dependencies: 331 | babel-plugin-transform-strict-mode "^6.18.0" 332 | babel-runtime "^6.0.0" 333 | babel-template "^6.16.0" 334 | babel-types "^6.18.0" 335 | 336 | babel-plugin-transform-es2015-modules-systemjs@^6.18.0: 337 | version "6.18.0" 338 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.18.0.tgz#f09294707163edae4d3b3e8bfacecd01d920b7ad" 339 | dependencies: 340 | babel-helper-hoist-variables "^6.18.0" 341 | babel-runtime "^6.11.6" 342 | babel-template "^6.14.0" 343 | 344 | babel-plugin-transform-es2015-modules-umd@^6.18.0: 345 | version "6.18.0" 346 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" 347 | dependencies: 348 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 349 | babel-runtime "^6.0.0" 350 | babel-template "^6.8.0" 351 | 352 | babel-plugin-transform-es2015-object-super@^6.3.13: 353 | version "6.8.0" 354 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" 355 | dependencies: 356 | babel-helper-replace-supers "^6.8.0" 357 | babel-runtime "^6.0.0" 358 | 359 | babel-plugin-transform-es2015-parameters@^6.18.0: 360 | version "6.18.0" 361 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" 362 | dependencies: 363 | babel-helper-call-delegate "^6.18.0" 364 | babel-helper-get-function-arity "^6.18.0" 365 | babel-runtime "^6.9.0" 366 | babel-template "^6.16.0" 367 | babel-traverse "^6.18.0" 368 | babel-types "^6.18.0" 369 | 370 | babel-plugin-transform-es2015-shorthand-properties@^6.18.0: 371 | version "6.18.0" 372 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" 373 | dependencies: 374 | babel-runtime "^6.0.0" 375 | babel-types "^6.18.0" 376 | 377 | babel-plugin-transform-es2015-spread@^6.3.13: 378 | version "6.8.0" 379 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" 380 | dependencies: 381 | babel-runtime "^6.0.0" 382 | 383 | babel-plugin-transform-es2015-sticky-regex@^6.3.13: 384 | version "6.8.0" 385 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" 386 | dependencies: 387 | babel-helper-regex "^6.8.0" 388 | babel-runtime "^6.0.0" 389 | babel-types "^6.8.0" 390 | 391 | babel-plugin-transform-es2015-template-literals@^6.6.0: 392 | version "6.8.0" 393 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" 394 | dependencies: 395 | babel-runtime "^6.0.0" 396 | 397 | babel-plugin-transform-es2015-typeof-symbol@^6.18.0: 398 | version "6.18.0" 399 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" 400 | dependencies: 401 | babel-runtime "^6.0.0" 402 | 403 | babel-plugin-transform-es2015-unicode-regex@^6.3.13: 404 | version "6.11.0" 405 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" 406 | dependencies: 407 | babel-helper-regex "^6.8.0" 408 | babel-runtime "^6.0.0" 409 | regexpu-core "^2.0.0" 410 | 411 | babel-plugin-transform-regenerator@^6.16.0: 412 | version "6.16.1" 413 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" 414 | dependencies: 415 | babel-runtime "^6.9.0" 416 | babel-types "^6.16.0" 417 | private "~0.1.5" 418 | 419 | babel-plugin-transform-strict-mode@^6.18.0: 420 | version "6.18.0" 421 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" 422 | dependencies: 423 | babel-runtime "^6.0.0" 424 | babel-types "^6.18.0" 425 | 426 | babel-polyfill@^6.16.0: 427 | version "6.16.0" 428 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" 429 | dependencies: 430 | babel-runtime "^6.9.1" 431 | core-js "^2.4.0" 432 | regenerator-runtime "^0.9.5" 433 | 434 | babel-preset-es2015: 435 | version "6.18.0" 436 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" 437 | dependencies: 438 | babel-plugin-check-es2015-constants "^6.3.13" 439 | babel-plugin-transform-es2015-arrow-functions "^6.3.13" 440 | babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" 441 | babel-plugin-transform-es2015-block-scoping "^6.18.0" 442 | babel-plugin-transform-es2015-classes "^6.18.0" 443 | babel-plugin-transform-es2015-computed-properties "^6.3.13" 444 | babel-plugin-transform-es2015-destructuring "^6.18.0" 445 | babel-plugin-transform-es2015-duplicate-keys "^6.6.0" 446 | babel-plugin-transform-es2015-for-of "^6.18.0" 447 | babel-plugin-transform-es2015-function-name "^6.9.0" 448 | babel-plugin-transform-es2015-literals "^6.3.13" 449 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 450 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 451 | babel-plugin-transform-es2015-modules-systemjs "^6.18.0" 452 | babel-plugin-transform-es2015-modules-umd "^6.18.0" 453 | babel-plugin-transform-es2015-object-super "^6.3.13" 454 | babel-plugin-transform-es2015-parameters "^6.18.0" 455 | babel-plugin-transform-es2015-shorthand-properties "^6.18.0" 456 | babel-plugin-transform-es2015-spread "^6.3.13" 457 | babel-plugin-transform-es2015-sticky-regex "^6.3.13" 458 | babel-plugin-transform-es2015-template-literals "^6.6.0" 459 | babel-plugin-transform-es2015-typeof-symbol "^6.18.0" 460 | babel-plugin-transform-es2015-unicode-regex "^6.3.13" 461 | babel-plugin-transform-regenerator "^6.16.0" 462 | 463 | babel-register@^6.18.0: 464 | version "6.18.0" 465 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" 466 | dependencies: 467 | babel-core "^6.18.0" 468 | babel-runtime "^6.11.6" 469 | core-js "^2.4.0" 470 | home-or-tmp "^2.0.0" 471 | lodash "^4.2.0" 472 | mkdirp "^0.5.1" 473 | source-map-support "^0.4.2" 474 | 475 | babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: 476 | version "6.18.0" 477 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" 478 | dependencies: 479 | core-js "^2.4.0" 480 | regenerator-runtime "^0.9.5" 481 | 482 | babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: 483 | version "6.16.0" 484 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" 485 | dependencies: 486 | babel-runtime "^6.9.0" 487 | babel-traverse "^6.16.0" 488 | babel-types "^6.16.0" 489 | babylon "^6.11.0" 490 | lodash "^4.2.0" 491 | 492 | babel-traverse@^6.16.0, babel-traverse@^6.18.0: 493 | version "6.18.0" 494 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" 495 | dependencies: 496 | babel-code-frame "^6.16.0" 497 | babel-messages "^6.8.0" 498 | babel-runtime "^6.9.0" 499 | babel-types "^6.18.0" 500 | babylon "^6.11.0" 501 | debug "^2.2.0" 502 | globals "^9.0.0" 503 | invariant "^2.2.0" 504 | lodash "^4.2.0" 505 | 506 | babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.8.0, babel-types@^6.9.0: 507 | version "6.18.0" 508 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" 509 | dependencies: 510 | babel-runtime "^6.9.1" 511 | esutils "^2.0.2" 512 | lodash "^4.2.0" 513 | to-fast-properties "^1.0.1" 514 | 515 | babylon@^6.11.0: 516 | version "6.13.1" 517 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" 518 | 519 | balanced-match@^0.4.1: 520 | version "0.4.2" 521 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 522 | 523 | bcrypt-pbkdf@^1.0.0: 524 | version "1.0.0" 525 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" 526 | dependencies: 527 | tweetnacl "^0.14.3" 528 | 529 | binary-extensions@^1.0.0: 530 | version "1.7.0" 531 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" 532 | 533 | block-stream@*: 534 | version "0.0.9" 535 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 536 | dependencies: 537 | inherits "~2.0.0" 538 | 539 | boom@2.x.x: 540 | version "2.10.1" 541 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 542 | dependencies: 543 | hoek "2.x.x" 544 | 545 | brace-expansion@^1.0.0: 546 | version "1.1.6" 547 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 548 | dependencies: 549 | balanced-match "^0.4.1" 550 | concat-map "0.0.1" 551 | 552 | braces@^1.8.2: 553 | version "1.8.5" 554 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 555 | dependencies: 556 | expand-range "^1.8.1" 557 | preserve "^0.2.0" 558 | repeat-element "^1.1.2" 559 | 560 | buffer-shims@^1.0.0: 561 | version "1.0.0" 562 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 563 | 564 | caseless@~0.11.0: 565 | version "0.11.0" 566 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 567 | 568 | chalk@^1.1.0, chalk@^1.1.1: 569 | version "1.1.3" 570 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 571 | dependencies: 572 | ansi-styles "^2.2.1" 573 | escape-string-regexp "^1.0.2" 574 | has-ansi "^2.0.0" 575 | strip-ansi "^3.0.0" 576 | supports-color "^2.0.0" 577 | 578 | chokidar@^1.0.0: 579 | version "1.6.1" 580 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 581 | dependencies: 582 | anymatch "^1.3.0" 583 | async-each "^1.0.0" 584 | glob-parent "^2.0.0" 585 | inherits "^2.0.1" 586 | is-binary-path "^1.0.0" 587 | is-glob "^2.0.0" 588 | path-is-absolute "^1.0.0" 589 | readdirp "^2.0.0" 590 | optionalDependencies: 591 | fsevents "^1.0.0" 592 | 593 | code-point-at@^1.0.0: 594 | version "1.0.1" 595 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" 596 | dependencies: 597 | number-is-nan "^1.0.0" 598 | 599 | combined-stream@^1.0.5, combined-stream@~1.0.5: 600 | version "1.0.5" 601 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 602 | dependencies: 603 | delayed-stream "~1.0.0" 604 | 605 | commander@^2.8.1, commander@^2.9.0: 606 | version "2.9.0" 607 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 608 | dependencies: 609 | graceful-readlink ">= 1.0.0" 610 | 611 | concat-map@0.0.1: 612 | version "0.0.1" 613 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 614 | 615 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 616 | version "1.1.0" 617 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 618 | 619 | content-disposition@0.5.1: 620 | version "0.5.1" 621 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" 622 | 623 | content-type@~1.0.2: 624 | version "1.0.2" 625 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" 626 | 627 | convert-source-map@^1.1.0: 628 | version "1.3.0" 629 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" 630 | 631 | cookie-signature@1.0.6: 632 | version "1.0.6" 633 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 634 | 635 | cookie@0.3.1: 636 | version "0.3.1" 637 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 638 | 639 | core-js@^2.4.0: 640 | version "2.4.1" 641 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 642 | 643 | core-util-is@~1.0.0: 644 | version "1.0.2" 645 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 646 | 647 | cryptiles@2.x.x: 648 | version "2.0.5" 649 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 650 | dependencies: 651 | boom "2.x.x" 652 | 653 | dashdash@^1.12.0: 654 | version "1.14.0" 655 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.0.tgz#29e486c5418bf0f356034a993d51686a33e84141" 656 | dependencies: 657 | assert-plus "^1.0.0" 658 | 659 | debug@^2.1.1, debug@^2.2.0, debug@~2.2.0: 660 | version "2.2.0" 661 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 662 | dependencies: 663 | ms "0.7.1" 664 | 665 | deep-extend@~0.4.0: 666 | version "0.4.1" 667 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 668 | 669 | delayed-stream@~1.0.0: 670 | version "1.0.0" 671 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 672 | 673 | delegates@^1.0.0: 674 | version "1.0.0" 675 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 676 | 677 | depd@~1.1.0: 678 | version "1.1.0" 679 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" 680 | 681 | destroy@~1.0.4: 682 | version "1.0.4" 683 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 684 | 685 | detect-indent@^4.0.0: 686 | version "4.0.0" 687 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 688 | dependencies: 689 | repeating "^2.0.0" 690 | 691 | ecc-jsbn@~0.1.1: 692 | version "0.1.1" 693 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 694 | dependencies: 695 | jsbn "~0.1.0" 696 | 697 | ee-first@1.1.1: 698 | version "1.1.1" 699 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 700 | 701 | encodeurl@~1.0.1: 702 | version "1.0.1" 703 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 704 | 705 | escape-html@~1.0.3: 706 | version "1.0.3" 707 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 708 | 709 | escape-string-regexp@^1.0.2: 710 | version "1.0.5" 711 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 712 | 713 | esutils@^2.0.2: 714 | version "2.0.2" 715 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 716 | 717 | etag@~1.7.0: 718 | version "1.7.0" 719 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" 720 | 721 | expand-brackets@^0.1.4: 722 | version "0.1.5" 723 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 724 | dependencies: 725 | is-posix-bracket "^0.1.0" 726 | 727 | expand-range@^1.8.1: 728 | version "1.8.2" 729 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 730 | dependencies: 731 | fill-range "^2.1.0" 732 | 733 | express: 734 | version "4.14.0" 735 | resolved "https://registry.yarnpkg.com/express/-/express-4.14.0.tgz#c1ee3f42cdc891fb3dc650a8922d51ec847d0d66" 736 | dependencies: 737 | accepts "~1.3.3" 738 | array-flatten "1.1.1" 739 | content-disposition "0.5.1" 740 | content-type "~1.0.2" 741 | cookie "0.3.1" 742 | cookie-signature "1.0.6" 743 | debug "~2.2.0" 744 | depd "~1.1.0" 745 | encodeurl "~1.0.1" 746 | escape-html "~1.0.3" 747 | etag "~1.7.0" 748 | finalhandler "0.5.0" 749 | fresh "0.3.0" 750 | merge-descriptors "1.0.1" 751 | methods "~1.1.2" 752 | on-finished "~2.3.0" 753 | parseurl "~1.3.1" 754 | path-to-regexp "0.1.7" 755 | proxy-addr "~1.1.2" 756 | qs "6.2.0" 757 | range-parser "~1.2.0" 758 | send "0.14.1" 759 | serve-static "~1.11.1" 760 | type-is "~1.6.13" 761 | utils-merge "1.0.0" 762 | vary "~1.1.0" 763 | 764 | extend@~3.0.0: 765 | version "3.0.0" 766 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 767 | 768 | extglob@^0.3.1: 769 | version "0.3.2" 770 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 771 | dependencies: 772 | is-extglob "^1.0.0" 773 | 774 | extsprintf@1.0.2: 775 | version "1.0.2" 776 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 777 | 778 | filename-regex@^2.0.0: 779 | version "2.0.0" 780 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 781 | 782 | fill-range@^2.1.0: 783 | version "2.2.3" 784 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 785 | dependencies: 786 | is-number "^2.1.0" 787 | isobject "^2.0.0" 788 | randomatic "^1.1.3" 789 | repeat-element "^1.1.2" 790 | repeat-string "^1.5.2" 791 | 792 | finalhandler@0.5.0: 793 | version "0.5.0" 794 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" 795 | dependencies: 796 | debug "~2.2.0" 797 | escape-html "~1.0.3" 798 | on-finished "~2.3.0" 799 | statuses "~1.3.0" 800 | unpipe "~1.0.0" 801 | 802 | for-in@^0.1.5: 803 | version "0.1.6" 804 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 805 | 806 | for-own@^0.1.4: 807 | version "0.1.4" 808 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 809 | dependencies: 810 | for-in "^0.1.5" 811 | 812 | forever-agent@~0.6.1: 813 | version "0.6.1" 814 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 815 | 816 | form-data@~2.1.1: 817 | version "2.1.1" 818 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.1.tgz#4adf0342e1a79afa1e84c8c320a9ffc82392a1f3" 819 | dependencies: 820 | asynckit "^0.4.0" 821 | combined-stream "^1.0.5" 822 | mime-types "^2.1.12" 823 | 824 | forwarded@~0.1.0: 825 | version "0.1.0" 826 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" 827 | 828 | fresh@0.3.0: 829 | version "0.3.0" 830 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" 831 | 832 | fs-readdir-recursive@^1.0.0: 833 | version "1.0.0" 834 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 835 | 836 | fs.realpath@^1.0.0: 837 | version "1.0.0" 838 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 839 | 840 | fsevents@^1.0.0: 841 | version "1.0.14" 842 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.14.tgz#558e8cc38643d8ef40fe45158486d0d25758eee4" 843 | dependencies: 844 | nan "^2.3.0" 845 | node-pre-gyp "^0.6.29" 846 | 847 | fstream-ignore@~1.0.5: 848 | version "1.0.5" 849 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 850 | dependencies: 851 | fstream "^1.0.0" 852 | inherits "2" 853 | minimatch "^3.0.0" 854 | 855 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: 856 | version "1.0.10" 857 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" 858 | dependencies: 859 | graceful-fs "^4.1.2" 860 | inherits "~2.0.0" 861 | mkdirp ">=0.5 0" 862 | rimraf "2" 863 | 864 | gauge@~2.6.0: 865 | version "2.6.0" 866 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" 867 | dependencies: 868 | aproba "^1.0.3" 869 | console-control-strings "^1.0.0" 870 | has-color "^0.1.7" 871 | has-unicode "^2.0.0" 872 | object-assign "^4.1.0" 873 | signal-exit "^3.0.0" 874 | string-width "^1.0.1" 875 | strip-ansi "^3.0.1" 876 | wide-align "^1.1.0" 877 | 878 | generate-function@^2.0.0: 879 | version "2.0.0" 880 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 881 | 882 | generate-object-property@^1.1.0: 883 | version "1.2.0" 884 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 885 | dependencies: 886 | is-property "^1.0.0" 887 | 888 | getpass@^0.1.1: 889 | version "0.1.6" 890 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 891 | dependencies: 892 | assert-plus "^1.0.0" 893 | 894 | glob-base@^0.3.0: 895 | version "0.3.0" 896 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 897 | dependencies: 898 | glob-parent "^2.0.0" 899 | is-glob "^2.0.0" 900 | 901 | glob-parent@^2.0.0: 902 | version "2.0.0" 903 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 904 | dependencies: 905 | is-glob "^2.0.0" 906 | 907 | glob@^5.0.5: 908 | version "5.0.15" 909 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 910 | dependencies: 911 | inflight "^1.0.4" 912 | inherits "2" 913 | minimatch "2 || 3" 914 | once "^1.3.0" 915 | path-is-absolute "^1.0.0" 916 | 917 | glob@^7.0.5: 918 | version "7.1.1" 919 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 920 | dependencies: 921 | fs.realpath "^1.0.0" 922 | inflight "^1.0.4" 923 | inherits "2" 924 | minimatch "^3.0.2" 925 | once "^1.3.0" 926 | path-is-absolute "^1.0.0" 927 | 928 | globals@^9.0.0: 929 | version "9.12.0" 930 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" 931 | 932 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 933 | version "4.1.9" 934 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" 935 | 936 | "graceful-readlink@>= 1.0.0": 937 | version "1.0.1" 938 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 939 | 940 | har-validator@~2.0.6: 941 | version "2.0.6" 942 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 943 | dependencies: 944 | chalk "^1.1.1" 945 | commander "^2.9.0" 946 | is-my-json-valid "^2.12.4" 947 | pinkie-promise "^2.0.0" 948 | 949 | has-ansi@^2.0.0: 950 | version "2.0.0" 951 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 952 | dependencies: 953 | ansi-regex "^2.0.0" 954 | 955 | has-color@^0.1.7: 956 | version "0.1.7" 957 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 958 | 959 | has-unicode@^2.0.0: 960 | version "2.0.1" 961 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 962 | 963 | hawk@~3.1.3: 964 | version "3.1.3" 965 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 966 | dependencies: 967 | boom "2.x.x" 968 | cryptiles "2.x.x" 969 | hoek "2.x.x" 970 | sntp "1.x.x" 971 | 972 | hoek@2.x.x: 973 | version "2.16.3" 974 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 975 | 976 | home-or-tmp@^2.0.0: 977 | version "2.0.0" 978 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 979 | dependencies: 980 | os-homedir "^1.0.0" 981 | os-tmpdir "^1.0.1" 982 | 983 | http-errors@~1.5.0: 984 | version "1.5.0" 985 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.0.tgz#b1cb3d8260fd8e2386cad3189045943372d48211" 986 | dependencies: 987 | inherits "2.0.1" 988 | setprototypeof "1.0.1" 989 | statuses ">= 1.3.0 < 2" 990 | 991 | http-signature@~1.1.0: 992 | version "1.1.1" 993 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 994 | dependencies: 995 | assert-plus "^0.2.0" 996 | jsprim "^1.2.2" 997 | sshpk "^1.7.0" 998 | 999 | inflight@^1.0.4: 1000 | version "1.0.6" 1001 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1002 | dependencies: 1003 | once "^1.3.0" 1004 | wrappy "1" 1005 | 1006 | inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2: 1007 | version "2.0.3" 1008 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1009 | 1010 | inherits@2.0.1: 1011 | version "2.0.1" 1012 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 1013 | 1014 | ini@~1.3.0: 1015 | version "1.3.4" 1016 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1017 | 1018 | invariant@^2.2.0: 1019 | version "2.2.1" 1020 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" 1021 | dependencies: 1022 | loose-envify "^1.0.0" 1023 | 1024 | ipaddr.js@1.1.1: 1025 | version "1.1.1" 1026 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.1.1.tgz#c791d95f52b29c1247d5df80ada39b8a73647230" 1027 | 1028 | is-binary-path@^1.0.0: 1029 | version "1.0.1" 1030 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1031 | dependencies: 1032 | binary-extensions "^1.0.0" 1033 | 1034 | is-buffer@^1.0.2: 1035 | version "1.1.4" 1036 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 1037 | 1038 | is-dotfile@^1.0.0: 1039 | version "1.0.2" 1040 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1041 | 1042 | is-equal-shallow@^0.1.3: 1043 | version "0.1.3" 1044 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1045 | dependencies: 1046 | is-primitive "^2.0.0" 1047 | 1048 | is-extendable@^0.1.1: 1049 | version "0.1.1" 1050 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1051 | 1052 | is-extglob@^1.0.0: 1053 | version "1.0.0" 1054 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1055 | 1056 | is-finite@^1.0.0: 1057 | version "1.0.2" 1058 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1059 | dependencies: 1060 | number-is-nan "^1.0.0" 1061 | 1062 | is-fullwidth-code-point@^1.0.0: 1063 | version "1.0.0" 1064 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1065 | dependencies: 1066 | number-is-nan "^1.0.0" 1067 | 1068 | is-glob@^2.0.0, is-glob@^2.0.1: 1069 | version "2.0.1" 1070 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1071 | dependencies: 1072 | is-extglob "^1.0.0" 1073 | 1074 | is-my-json-valid@^2.12.4: 1075 | version "2.15.0" 1076 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 1077 | dependencies: 1078 | generate-function "^2.0.0" 1079 | generate-object-property "^1.1.0" 1080 | jsonpointer "^4.0.0" 1081 | xtend "^4.0.0" 1082 | 1083 | is-number@^2.0.2, is-number@^2.1.0: 1084 | version "2.1.0" 1085 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1086 | dependencies: 1087 | kind-of "^3.0.2" 1088 | 1089 | is-posix-bracket@^0.1.0: 1090 | version "0.1.1" 1091 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1092 | 1093 | is-primitive@^2.0.0: 1094 | version "2.0.0" 1095 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1096 | 1097 | is-property@^1.0.0: 1098 | version "1.0.2" 1099 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 1100 | 1101 | is-typedarray@~1.0.0: 1102 | version "1.0.0" 1103 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1104 | 1105 | isarray@~1.0.0, isarray@1.0.0: 1106 | version "1.0.0" 1107 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1108 | 1109 | isobject@^2.0.0: 1110 | version "2.1.0" 1111 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1112 | dependencies: 1113 | isarray "1.0.0" 1114 | 1115 | isstream@~0.1.2: 1116 | version "0.1.2" 1117 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1118 | 1119 | jodid25519@^1.0.0: 1120 | version "1.0.2" 1121 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1122 | dependencies: 1123 | jsbn "~0.1.0" 1124 | 1125 | js-tokens@^2.0.0: 1126 | version "2.0.0" 1127 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" 1128 | 1129 | jsbn@~0.1.0: 1130 | version "0.1.0" 1131 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" 1132 | 1133 | jsesc@^1.3.0: 1134 | version "1.3.0" 1135 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1136 | 1137 | jsesc@~0.5.0: 1138 | version "0.5.0" 1139 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1140 | 1141 | json-schema@0.2.3: 1142 | version "0.2.3" 1143 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1144 | 1145 | json-stringify-safe@~5.0.1: 1146 | version "5.0.1" 1147 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1148 | 1149 | json5@^0.5.0: 1150 | version "0.5.0" 1151 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" 1152 | 1153 | jsonpointer@^4.0.0: 1154 | version "4.0.0" 1155 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 1156 | 1157 | jsprim@^1.2.2: 1158 | version "1.3.1" 1159 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 1160 | dependencies: 1161 | extsprintf "1.0.2" 1162 | json-schema "0.2.3" 1163 | verror "1.3.6" 1164 | 1165 | kind-of@^3.0.2: 1166 | version "3.0.4" 1167 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 1168 | dependencies: 1169 | is-buffer "^1.0.2" 1170 | 1171 | lodash@^4.2.0: 1172 | version "4.16.4" 1173 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" 1174 | 1175 | loose-envify@^1.0.0: 1176 | version "1.3.0" 1177 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" 1178 | dependencies: 1179 | js-tokens "^2.0.0" 1180 | 1181 | media-typer@0.3.0: 1182 | version "0.3.0" 1183 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1184 | 1185 | merge-descriptors@1.0.1: 1186 | version "1.0.1" 1187 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1188 | 1189 | methods@~1.1.2: 1190 | version "1.1.2" 1191 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1192 | 1193 | micromatch@^2.1.5: 1194 | version "2.3.11" 1195 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1196 | dependencies: 1197 | arr-diff "^2.0.0" 1198 | array-unique "^0.2.1" 1199 | braces "^1.8.2" 1200 | expand-brackets "^0.1.4" 1201 | extglob "^0.3.1" 1202 | filename-regex "^2.0.0" 1203 | is-extglob "^1.0.0" 1204 | is-glob "^2.0.1" 1205 | kind-of "^3.0.2" 1206 | normalize-path "^2.0.1" 1207 | object.omit "^2.0.0" 1208 | parse-glob "^3.0.4" 1209 | regex-cache "^0.4.2" 1210 | 1211 | mime-db@~1.24.0: 1212 | version "1.24.0" 1213 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c" 1214 | 1215 | mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.7: 1216 | version "2.1.12" 1217 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.12.tgz#152ba256777020dd4663f54c2e7bc26381e71729" 1218 | dependencies: 1219 | mime-db "~1.24.0" 1220 | 1221 | mime@1.3.4: 1222 | version "1.3.4" 1223 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 1224 | 1225 | minimatch@^3.0.0, minimatch@^3.0.2, "minimatch@2 || 3": 1226 | version "3.0.3" 1227 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1228 | dependencies: 1229 | brace-expansion "^1.0.0" 1230 | 1231 | minimist@^1.2.0: 1232 | version "1.2.0" 1233 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1234 | 1235 | minimist@0.0.8: 1236 | version "0.0.8" 1237 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1238 | 1239 | mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.1: 1240 | version "0.5.1" 1241 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1242 | dependencies: 1243 | minimist "0.0.8" 1244 | 1245 | ms@0.7.1: 1246 | version "0.7.1" 1247 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1248 | 1249 | nan@^2.3.0: 1250 | version "2.4.0" 1251 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" 1252 | 1253 | negotiator@0.6.1: 1254 | version "0.6.1" 1255 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1256 | 1257 | node-pre-gyp@^0.6.29: 1258 | version "0.6.31" 1259 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" 1260 | dependencies: 1261 | mkdirp "~0.5.1" 1262 | nopt "~3.0.6" 1263 | npmlog "^4.0.0" 1264 | rc "~1.1.6" 1265 | request "^2.75.0" 1266 | rimraf "~2.5.4" 1267 | semver "~5.3.0" 1268 | tar "~2.2.1" 1269 | tar-pack "~3.3.0" 1270 | 1271 | node-uuid@~1.4.7: 1272 | version "1.4.7" 1273 | resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" 1274 | 1275 | nopt@~3.0.6: 1276 | version "3.0.6" 1277 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1278 | dependencies: 1279 | abbrev "1" 1280 | 1281 | normalize-path@^2.0.1: 1282 | version "2.0.1" 1283 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 1284 | 1285 | npmlog@^4.0.0: 1286 | version "4.0.0" 1287 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.0.tgz#e094503961c70c1774eb76692080e8d578a9f88f" 1288 | dependencies: 1289 | are-we-there-yet "~1.1.2" 1290 | console-control-strings "~1.1.0" 1291 | gauge "~2.6.0" 1292 | set-blocking "~2.0.0" 1293 | 1294 | number-is-nan@^1.0.0: 1295 | version "1.0.1" 1296 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1297 | 1298 | oauth-sign@~0.8.1: 1299 | version "0.8.2" 1300 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1301 | 1302 | object-assign@^4.1.0: 1303 | version "4.1.0" 1304 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1305 | 1306 | object.omit@^2.0.0: 1307 | version "2.0.1" 1308 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1309 | dependencies: 1310 | for-own "^0.1.4" 1311 | is-extendable "^0.1.1" 1312 | 1313 | on-finished@~2.3.0: 1314 | version "2.3.0" 1315 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1316 | dependencies: 1317 | ee-first "1.1.1" 1318 | 1319 | once@^1.3.0: 1320 | version "1.4.0" 1321 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1322 | dependencies: 1323 | wrappy "1" 1324 | 1325 | once@~1.3.3: 1326 | version "1.3.3" 1327 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1328 | dependencies: 1329 | wrappy "1" 1330 | 1331 | os-homedir@^1.0.0: 1332 | version "1.0.2" 1333 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1334 | 1335 | os-tmpdir@^1.0.1: 1336 | version "1.0.2" 1337 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1338 | 1339 | output-file-sync@^1.1.0: 1340 | version "1.1.2" 1341 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1342 | dependencies: 1343 | graceful-fs "^4.1.4" 1344 | mkdirp "^0.5.1" 1345 | object-assign "^4.1.0" 1346 | 1347 | parse-glob@^3.0.4: 1348 | version "3.0.4" 1349 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1350 | dependencies: 1351 | glob-base "^0.3.0" 1352 | is-dotfile "^1.0.0" 1353 | is-extglob "^1.0.0" 1354 | is-glob "^2.0.0" 1355 | 1356 | parseurl@~1.3.1: 1357 | version "1.3.1" 1358 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" 1359 | 1360 | path-is-absolute@^1.0.0: 1361 | version "1.0.1" 1362 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1363 | 1364 | path-to-regexp@0.1.7: 1365 | version "0.1.7" 1366 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1367 | 1368 | pinkie-promise@^2.0.0: 1369 | version "2.0.1" 1370 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1371 | dependencies: 1372 | pinkie "^2.0.0" 1373 | 1374 | pinkie@^2.0.0: 1375 | version "2.0.4" 1376 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1377 | 1378 | preserve@^0.2.0: 1379 | version "0.2.0" 1380 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1381 | 1382 | private@^0.1.6, private@~0.1.5: 1383 | version "0.1.6" 1384 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" 1385 | 1386 | process-nextick-args@~1.0.6: 1387 | version "1.0.7" 1388 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1389 | 1390 | proxy-addr@~1.1.2: 1391 | version "1.1.2" 1392 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.2.tgz#b4cc5f22610d9535824c123aef9d3cf73c40ba37" 1393 | dependencies: 1394 | forwarded "~0.1.0" 1395 | ipaddr.js "1.1.1" 1396 | 1397 | punycode@^1.4.1: 1398 | version "1.4.1" 1399 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1400 | 1401 | qs@~6.3.0: 1402 | version "6.3.0" 1403 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" 1404 | 1405 | qs@6.2.0: 1406 | version "6.2.0" 1407 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" 1408 | 1409 | randomatic@^1.1.3: 1410 | version "1.1.5" 1411 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" 1412 | dependencies: 1413 | is-number "^2.0.2" 1414 | kind-of "^3.0.2" 1415 | 1416 | range-parser@~1.2.0: 1417 | version "1.2.0" 1418 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 1419 | 1420 | rc@~1.1.6: 1421 | version "1.1.6" 1422 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 1423 | dependencies: 1424 | deep-extend "~0.4.0" 1425 | ini "~1.3.0" 1426 | minimist "^1.2.0" 1427 | strip-json-comments "~1.0.4" 1428 | 1429 | "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@~2.1.4: 1430 | version "2.1.5" 1431 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 1432 | dependencies: 1433 | buffer-shims "^1.0.0" 1434 | core-util-is "~1.0.0" 1435 | inherits "~2.0.1" 1436 | isarray "~1.0.0" 1437 | process-nextick-args "~1.0.6" 1438 | string_decoder "~0.10.x" 1439 | util-deprecate "~1.0.1" 1440 | 1441 | readdirp@^2.0.0: 1442 | version "2.1.0" 1443 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1444 | dependencies: 1445 | graceful-fs "^4.1.2" 1446 | minimatch "^3.0.2" 1447 | readable-stream "^2.0.2" 1448 | set-immediate-shim "^1.0.1" 1449 | 1450 | regenerate@^1.2.1: 1451 | version "1.3.1" 1452 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.1.tgz#0300203a5d2fdcf89116dce84275d011f5903f33" 1453 | 1454 | regenerator-runtime@^0.9.5: 1455 | version "0.9.5" 1456 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" 1457 | 1458 | regex-cache@^0.4.2: 1459 | version "0.4.3" 1460 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1461 | dependencies: 1462 | is-equal-shallow "^0.1.3" 1463 | is-primitive "^2.0.0" 1464 | 1465 | regexpu-core@^2.0.0: 1466 | version "2.0.0" 1467 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1468 | dependencies: 1469 | regenerate "^1.2.1" 1470 | regjsgen "^0.2.0" 1471 | regjsparser "^0.1.4" 1472 | 1473 | regjsgen@^0.2.0: 1474 | version "0.2.0" 1475 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1476 | 1477 | regjsparser@^0.1.4: 1478 | version "0.1.5" 1479 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1480 | dependencies: 1481 | jsesc "~0.5.0" 1482 | 1483 | repeat-element@^1.1.2: 1484 | version "1.1.2" 1485 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1486 | 1487 | repeat-string@^1.5.2: 1488 | version "1.6.1" 1489 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1490 | 1491 | repeating@^2.0.0: 1492 | version "2.0.1" 1493 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1494 | dependencies: 1495 | is-finite "^1.0.0" 1496 | 1497 | request@^2.75.0: 1498 | version "2.76.0" 1499 | resolved "https://registry.yarnpkg.com/request/-/request-2.76.0.tgz#be44505afef70360a0436955106be3945d95560e" 1500 | dependencies: 1501 | aws-sign2 "~0.6.0" 1502 | aws4 "^1.2.1" 1503 | caseless "~0.11.0" 1504 | combined-stream "~1.0.5" 1505 | extend "~3.0.0" 1506 | forever-agent "~0.6.1" 1507 | form-data "~2.1.1" 1508 | har-validator "~2.0.6" 1509 | hawk "~3.1.3" 1510 | http-signature "~1.1.0" 1511 | is-typedarray "~1.0.0" 1512 | isstream "~0.1.2" 1513 | json-stringify-safe "~5.0.1" 1514 | mime-types "~2.1.7" 1515 | node-uuid "~1.4.7" 1516 | oauth-sign "~0.8.1" 1517 | qs "~6.3.0" 1518 | stringstream "~0.0.4" 1519 | tough-cookie "~2.3.0" 1520 | tunnel-agent "~0.4.1" 1521 | 1522 | rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: 1523 | version "2.5.4" 1524 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1525 | dependencies: 1526 | glob "^7.0.5" 1527 | 1528 | semver@~5.3.0: 1529 | version "5.3.0" 1530 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1531 | 1532 | send@0.14.1: 1533 | version "0.14.1" 1534 | resolved "https://registry.yarnpkg.com/send/-/send-0.14.1.tgz#a954984325392f51532a7760760e459598c89f7a" 1535 | dependencies: 1536 | debug "~2.2.0" 1537 | depd "~1.1.0" 1538 | destroy "~1.0.4" 1539 | encodeurl "~1.0.1" 1540 | escape-html "~1.0.3" 1541 | etag "~1.7.0" 1542 | fresh "0.3.0" 1543 | http-errors "~1.5.0" 1544 | mime "1.3.4" 1545 | ms "0.7.1" 1546 | on-finished "~2.3.0" 1547 | range-parser "~1.2.0" 1548 | statuses "~1.3.0" 1549 | 1550 | serve-static@~1.11.1: 1551 | version "1.11.1" 1552 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.1.tgz#d6cce7693505f733c759de57befc1af76c0f0805" 1553 | dependencies: 1554 | encodeurl "~1.0.1" 1555 | escape-html "~1.0.3" 1556 | parseurl "~1.3.1" 1557 | send "0.14.1" 1558 | 1559 | set-blocking@~2.0.0: 1560 | version "2.0.0" 1561 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1562 | 1563 | set-immediate-shim@^1.0.1: 1564 | version "1.0.1" 1565 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1566 | 1567 | setprototypeof@1.0.1: 1568 | version "1.0.1" 1569 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.1.tgz#52009b27888c4dc48f591949c0a8275834c1ca7e" 1570 | 1571 | signal-exit@^3.0.0: 1572 | version "3.0.1" 1573 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 1574 | 1575 | slash@^1.0.0: 1576 | version "1.0.0" 1577 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1578 | 1579 | sntp@1.x.x: 1580 | version "1.0.9" 1581 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1582 | dependencies: 1583 | hoek "2.x.x" 1584 | 1585 | source-map-support@^0.4.2: 1586 | version "0.4.5" 1587 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.5.tgz#4438df4219e1b3c7feb674614b4c67f9722db1e4" 1588 | dependencies: 1589 | source-map "^0.5.3" 1590 | 1591 | source-map@^0.5.0, source-map@^0.5.3: 1592 | version "0.5.6" 1593 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1594 | 1595 | sshpk@^1.7.0: 1596 | version "1.10.1" 1597 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" 1598 | dependencies: 1599 | asn1 "~0.2.3" 1600 | assert-plus "^1.0.0" 1601 | dashdash "^1.12.0" 1602 | getpass "^0.1.1" 1603 | optionalDependencies: 1604 | bcrypt-pbkdf "^1.0.0" 1605 | ecc-jsbn "~0.1.1" 1606 | jodid25519 "^1.0.0" 1607 | jsbn "~0.1.0" 1608 | tweetnacl "~0.14.0" 1609 | 1610 | "statuses@>= 1.3.0 < 2", statuses@~1.3.0: 1611 | version "1.3.0" 1612 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.0.tgz#8e55758cb20e7682c1f4fce8dcab30bf01d1e07a" 1613 | 1614 | string_decoder@~0.10.x: 1615 | version "0.10.31" 1616 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1617 | 1618 | string-width@^1.0.1: 1619 | version "1.0.2" 1620 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1621 | dependencies: 1622 | code-point-at "^1.0.0" 1623 | is-fullwidth-code-point "^1.0.0" 1624 | strip-ansi "^3.0.0" 1625 | 1626 | stringstream@~0.0.4: 1627 | version "0.0.5" 1628 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1629 | 1630 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1631 | version "3.0.1" 1632 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1633 | dependencies: 1634 | ansi-regex "^2.0.0" 1635 | 1636 | strip-json-comments@~1.0.4: 1637 | version "1.0.4" 1638 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 1639 | 1640 | supports-color@^2.0.0: 1641 | version "2.0.0" 1642 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1643 | 1644 | tar-pack@~3.3.0: 1645 | version "3.3.0" 1646 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" 1647 | dependencies: 1648 | debug "~2.2.0" 1649 | fstream "~1.0.10" 1650 | fstream-ignore "~1.0.5" 1651 | once "~1.3.3" 1652 | readable-stream "~2.1.4" 1653 | rimraf "~2.5.1" 1654 | tar "~2.2.1" 1655 | uid-number "~0.0.6" 1656 | 1657 | tar@~2.2.1: 1658 | version "2.2.1" 1659 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1660 | dependencies: 1661 | block-stream "*" 1662 | fstream "^1.0.2" 1663 | inherits "2" 1664 | 1665 | to-fast-properties@^1.0.1: 1666 | version "1.0.2" 1667 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 1668 | 1669 | tough-cookie@~2.3.0: 1670 | version "2.3.2" 1671 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1672 | dependencies: 1673 | punycode "^1.4.1" 1674 | 1675 | tunnel-agent@~0.4.1: 1676 | version "0.4.3" 1677 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1678 | 1679 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1680 | version "0.14.3" 1681 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" 1682 | 1683 | type-is@~1.6.13: 1684 | version "1.6.13" 1685 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.13.tgz#6e83ba7bc30cd33a7bb0b7fb00737a2085bf9d08" 1686 | dependencies: 1687 | media-typer "0.3.0" 1688 | mime-types "~2.1.11" 1689 | 1690 | uid-number@~0.0.6: 1691 | version "0.0.6" 1692 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1693 | 1694 | unpipe@~1.0.0: 1695 | version "1.0.0" 1696 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1697 | 1698 | user-home@^1.1.1: 1699 | version "1.1.1" 1700 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1701 | 1702 | util-deprecate@~1.0.1: 1703 | version "1.0.2" 1704 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1705 | 1706 | utils-merge@1.0.0: 1707 | version "1.0.0" 1708 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 1709 | 1710 | v8flags@^2.0.10: 1711 | version "2.0.11" 1712 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" 1713 | dependencies: 1714 | user-home "^1.1.1" 1715 | 1716 | vary@~1.1.0: 1717 | version "1.1.0" 1718 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" 1719 | 1720 | verror@1.3.6: 1721 | version "1.3.6" 1722 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1723 | dependencies: 1724 | extsprintf "1.0.2" 1725 | 1726 | wide-align@^1.1.0: 1727 | version "1.1.0" 1728 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 1729 | dependencies: 1730 | string-width "^1.0.1" 1731 | 1732 | wrappy@1: 1733 | version "1.0.2" 1734 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1735 | 1736 | xtend@^4.0.0: 1737 | version "4.0.1" 1738 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1739 | 1740 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-torch", 3 | "version": "0.1.7", 4 | "license": "MIT", 5 | "main": "build/torch.js", 6 | "types": "./express-torch.d.ts", 7 | "repository": { 8 | "type": "git", 9 | "url": "git://github.com/JBlaak/Torch.git" 10 | }, 11 | "scripts": { 12 | "prepublish": "yarn build", 13 | "build": "rm -rf ./build && tsc && yarn declarations && yarn declaration-bundle", 14 | "pretest": "tsc --project tsconfig.test.json", 15 | "test": "yarn lint && yarn mocha", 16 | "lint": "tslint ./src/*.ts ./src/**/*.ts", 17 | "mocha": "nyc --reporter=lcov --reporter=text --check-coverage --lines 100 --functions 100 --branches 100 mocha tests --recursive", 18 | "declarations": "tsc --declaration", 19 | "declaration-bundle": "dts-bundle --name express-torch --out ./express-torch.d.ts --main ./build/torch.d.ts && mv ./build/express-torch.d.ts ./express-torch.d.ts" 20 | }, 21 | "devDependencies": { 22 | "@types/chai": "^3.4.34", 23 | "@types/expect.js": "^0.3.29", 24 | "@types/express": "^4.0.33", 25 | "@types/mocha": "^2.2.32", 26 | "chai": "^3.5.0", 27 | "dts-bundle": "^0.6.1", 28 | "mocha": "^3.1.2", 29 | "nyc": "^8.3.2", 30 | "tslint": "^4.2.0", 31 | "typescript": "^2.0.6" 32 | }, 33 | "dependencies": { 34 | "path-to-regexp": "^2.2.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/connect.ts: -------------------------------------------------------------------------------- 1 | import {Application} from 'express'; 2 | 3 | import transfer from './connect/transfer'; 4 | import {Middleware} from './models/middleware'; 5 | import Route from './route'; 6 | import Router from './router'; 7 | import {constrain} from './util/constrain_path'; 8 | import {trim} from './util/trim'; 9 | 10 | export default function connect(app: Application, 11 | router: Router, 12 | previouxPrefix: string[] = [], 13 | previousMiddleware: Middleware[] = [], 14 | currentContext: any = undefined 15 | ): Route[] { 16 | 17 | let routes: Route[] = []; 18 | 19 | let prefix = [...previouxPrefix]; 20 | if (router.prefix !== null) { 21 | prefix.push(trim(router.prefix)); 22 | } 23 | 24 | /* Transfer each route to Express */ 25 | router.routes.forEach((route: Route) => { 26 | let path = ''; 27 | if (prefix.length > 0) { 28 | path += '/' + prefix.join('/'); 29 | } 30 | if (trim(route.path) !== '') { 31 | path += '/' + trim(route.path); 32 | } 33 | 34 | /* Add where constraints */ 35 | const constraints = route.getConstraints(); 36 | if (constraints !== undefined) { 37 | path = constrain(path, constraints); 38 | } 39 | 40 | /* Extract context */ 41 | const context = route.context || currentContext; 42 | 43 | /* Transfer to Express */ 44 | transfer( 45 | app, 46 | route.method, 47 | path, 48 | [...previousMiddleware, ...router.middleware, ...route.middleware], 49 | context ? route.controller.bind(context) : route.controller 50 | ); 51 | 52 | /* Add to routes listing */ 53 | const aggregatedRoute = new Route(route.method, path, route.controller); 54 | aggregatedRoute.middleware = [...previousMiddleware, ...router.middleware, ...route.middleware]; 55 | aggregatedRoute.name = route.name; 56 | routes.push(aggregatedRoute); 57 | }); 58 | 59 | /* Recursively transfer routes of each group as well including the parent middleware and prefix */ 60 | router.groups.forEach((group: Router) => { 61 | routes = [...routes, ...connect( 62 | app, 63 | group, 64 | prefix, 65 | [...previousMiddleware, ...router.middleware], 66 | group.context || currentContext 67 | )]; 68 | }); 69 | 70 | return routes; 71 | }; 72 | -------------------------------------------------------------------------------- /src/connect/transfer.ts: -------------------------------------------------------------------------------- 1 | import {Application, Request, Response, NextFunction} from 'express'; 2 | import {Controller} from "../models/controller"; 3 | import {Middleware} from '../models/middleware'; 4 | 5 | /** 6 | * Transfer the different methods to the Express application 7 | * @param app 8 | * @param method 9 | * @param path 10 | * @param middleware 11 | * @param controller 12 | */ 13 | export default function transfer(app: Application, 14 | method: string, 15 | path: string, 16 | middleware: Middleware[], 17 | controller: Controller) { 18 | switch (method) { 19 | case 'get': 20 | app.get(path, middleware, controller); 21 | break; 22 | case 'post': 23 | app.post(path, middleware, controller); 24 | break; 25 | case 'put': 26 | app.put(path, middleware, controller); 27 | break; 28 | case 'delete': 29 | app.delete(path, middleware, controller); 30 | break; 31 | default: 32 | throw new Error('Unknown method requested for transfer: ' + method); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /src/models/controller.ts: -------------------------------------------------------------------------------- 1 | import {Request, Response, NextFunction} from 'express'; 2 | 3 | export type Controller = (req: Request, res: Response, next?: NextFunction) => void; 4 | -------------------------------------------------------------------------------- /src/models/group_config.ts: -------------------------------------------------------------------------------- 1 | import {Request, Response, NextFunction} from 'express'; 2 | import {Middleware} from './middleware'; 3 | 4 | export interface GroupConfig { 5 | middleware?: Middleware[]; 6 | prefix?: string; 7 | context?: any; 8 | } 9 | -------------------------------------------------------------------------------- /src/models/middleware.ts: -------------------------------------------------------------------------------- 1 | import {Request, Response, NextFunction} from 'express'; 2 | 3 | export type NormalMiddleware = (req: Request, res: Response, next: NextFunction) => any; 4 | export type ErrorMiddleware = (err: any, req: Request, res: Response, next: NextFunction) => any; 5 | 6 | export type Middleware = NormalMiddleware | ErrorMiddleware; 7 | -------------------------------------------------------------------------------- /src/models/request_with_torch.ts: -------------------------------------------------------------------------------- 1 | import {Request} from 'express'; 2 | import {Routes} from '../torch'; 3 | 4 | export interface RequestWithTorch extends Request { 5 | routes: Routes; 6 | } 7 | -------------------------------------------------------------------------------- /src/models/route_config.ts: -------------------------------------------------------------------------------- 1 | import {Controller} from './controller'; 2 | import {Middleware} from './middleware'; 3 | 4 | export interface RouteConfig { 5 | controller: Controller; 6 | method?: string; 7 | name?: string; 8 | middleware?: Middleware[]; 9 | context?: any; 10 | } 11 | -------------------------------------------------------------------------------- /src/route.ts: -------------------------------------------------------------------------------- 1 | import {Controller} from './models/controller'; 2 | import {Middleware} from './models/middleware'; 3 | 4 | export default class Route { 5 | private _method: string; 6 | 7 | private _path: string; 8 | 9 | private _name: string | undefined; 10 | 11 | private _constraints: { [key: string]: string } | undefined; 12 | 13 | private _middleware: Middleware[]; 14 | 15 | private _context: any; 16 | 17 | private _controller: Controller; 18 | 19 | constructor(method: string, path: string, controller: Controller) { 20 | this._method = method; 21 | this._path = path; 22 | this._controller = controller; 23 | } 24 | 25 | get method(): string { 26 | return this._method; 27 | } 28 | 29 | get path(): string { 30 | return this._path; 31 | } 32 | 33 | get controller(): Controller { 34 | return this._controller; 35 | } 36 | 37 | get middleware(): Middleware[] { 38 | return this._middleware || []; 39 | } 40 | 41 | set middleware(value: Middleware[]) { 42 | this._middleware = value; 43 | } 44 | 45 | get context(): any { 46 | return this._context; 47 | } 48 | 49 | set context(value: any) { 50 | this._context = value; 51 | } 52 | 53 | get name(): string|undefined { 54 | return this._name; 55 | } 56 | 57 | set name(value: string|undefined) { 58 | this._name = value; 59 | } 60 | 61 | public where(constraints: { [key: string]: string } | undefined) { 62 | this._constraints = constraints; 63 | } 64 | 65 | public getConstraints(): {[key: string]: string} | undefined { 66 | return this._constraints; 67 | } 68 | }; 69 | -------------------------------------------------------------------------------- /src/router.ts: -------------------------------------------------------------------------------- 1 | import {Controller} from './models/controller'; 2 | import {GroupConfig} from './models/group_config'; 3 | import {Middleware} from './models/middleware'; 4 | import {RouteConfig} from './models/route_config'; 5 | import Route from './route'; 6 | 7 | export default class Router { 8 | 9 | /** 10 | * Configuration of this group, will be applied nested when transferred to Expresss 11 | */ 12 | private _config: GroupConfig; 13 | 14 | /** 15 | * List of all groups beneath this one 16 | */ 17 | private _groups: Router[] = []; 18 | 19 | /** 20 | * The different routes applicable in this router 21 | */ 22 | private _routes: Route[] = []; 23 | 24 | /** 25 | * Setup configuration 26 | * @param config 27 | */ 28 | constructor(config: GroupConfig) { 29 | this._config = config; 30 | } 31 | 32 | /** 33 | * Getter for groups 34 | */ 35 | get groups(): Router[] { 36 | return this._groups; 37 | } 38 | 39 | /** 40 | * Getter for routes 41 | */ 42 | get routes(): Route[] { 43 | return this._routes; 44 | } 45 | 46 | /** 47 | * Get prefix for routes of this router 48 | * @returns {string|string} 49 | */ 50 | get middleware(): Middleware[] { 51 | return this._config.middleware || []; 52 | } 53 | 54 | /** 55 | * Get prefix for routes of this router 56 | * @returns {string|null} 57 | */ 58 | get prefix(): string|null { 59 | return this._config.prefix || null; 60 | } 61 | 62 | /** 63 | * Context for routes in this group 64 | * @returns {any} 65 | */ 66 | get context(): any { 67 | return this._config.context; 68 | } 69 | 70 | /** 71 | * GET method 72 | * @param path 73 | * @param config 74 | */ 75 | public get(path: string, config: Controller | RouteConfig): Route { 76 | const route = this.toRoute('get', path, config); 77 | 78 | this._routes.push(route); 79 | 80 | return route; 81 | } 82 | 83 | /** 84 | * POST method 85 | * @param path 86 | * @param config 87 | */ 88 | public post(path: string, config: Controller | RouteConfig): Route { 89 | const route = this.toRoute('post', path, config); 90 | 91 | this._routes.push(route); 92 | 93 | return route; 94 | } 95 | 96 | /** 97 | * PUT method 98 | * @param path 99 | * @param config 100 | */ 101 | public put(path: string, config: Controller | RouteConfig): Route { 102 | const route = this.toRoute('put', path, config); 103 | 104 | this._routes.push(route); 105 | 106 | return route; 107 | } 108 | 109 | /** 110 | * DELETE method 111 | * @param path 112 | * @param config 113 | */ 114 | public delete(path: string, config: Controller | RouteConfig): Route { 115 | const route = this.toRoute('delete', path, config); 116 | 117 | this._routes.push(route); 118 | 119 | return route; 120 | } 121 | 122 | /** 123 | * Register a new group of routes with their own configurations 124 | * @param config 125 | * @param callback 126 | */ 127 | public group(config: GroupConfig, callback: (router: Router) => void) { 128 | const router = new Router(config); 129 | 130 | callback(router); 131 | 132 | this._groups.push(router); 133 | } 134 | 135 | /** 136 | * Transform to route 137 | * @param method 138 | * @param path 139 | * @param controller 140 | * @returns Route 141 | */ 142 | private toRoute(method: string, path: string, controller: Controller | RouteConfig): Route { 143 | if (typeof controller === 'function') { 144 | return new Route(method, path, (controller as Controller)); 145 | } 146 | 147 | const config = (controller as RouteConfig); 148 | 149 | const route = new Route( 150 | config.method ? config.method : method, 151 | path, 152 | config.controller 153 | ); 154 | route.name = config.name; 155 | if (config.middleware) { 156 | route.middleware = config.middleware; 157 | } 158 | if (config.context) { 159 | route.context = config.context; 160 | } 161 | 162 | return route; 163 | } 164 | }; 165 | -------------------------------------------------------------------------------- /src/routes.ts: -------------------------------------------------------------------------------- 1 | import Route from "./route"; 2 | import {compile} from 'path-to-regexp'; 3 | 4 | export default class Routes { 5 | 6 | /** 7 | * List of all routes in the application 8 | */ 9 | private _routes: Route[]; 10 | 11 | set routes(value: Route[]) { 12 | this._routes = value; 13 | } 14 | 15 | /** 16 | * Get url of named route 17 | * @param name 18 | * @param args 19 | * @returns {string|undefined} 20 | */ 21 | public named(name: string, args: Object = {}): string|undefined { 22 | for (let key in this._routes) { 23 | if (this._routes[key].name === name) { 24 | return compile(this._routes[key].path)(args); 25 | } 26 | } 27 | } 28 | 29 | /** 30 | * Get a listing of all routes 31 | * @returns {Route[]} 32 | */ 33 | public all() { 34 | return this._routes; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/torch.ts: -------------------------------------------------------------------------------- 1 | import {Application, Request, Response, NextFunction} from 'express'; 2 | import Router from './router'; 3 | import {RouteConfig} from './models/route_config'; 4 | import {GroupConfig} from './models/group_config'; 5 | import connect from './connect'; 6 | import Routes from './routes'; 7 | import {RequestWithTorch} from './models/request_with_torch'; 8 | 9 | export type Router = Router; 10 | export type Route = RouteConfig; 11 | export type Group = GroupConfig; 12 | export type Routes = Routes; 13 | 14 | export default function Torch(app: Application, callback: (router: Router) => void): Routes { 15 | let routes: Routes = new Routes(); 16 | 17 | const router = new Router({ 18 | middleware: [(req: RequestWithTorch, res: Response, next: NextFunction) => { 19 | req.routes = routes; 20 | next(); 21 | }] 22 | }); 23 | 24 | callback(router); 25 | 26 | routes.routes = connect(app, router); 27 | 28 | return routes; 29 | } 30 | -------------------------------------------------------------------------------- /src/util/constrain_path.ts: -------------------------------------------------------------------------------- 1 | import {parse, tokensToFunction} from 'path-to-regexp'; 2 | 3 | export function constrain(path: string, constraints: {[key: string]: string}) { 4 | const tokens = parse(path); 5 | 6 | // If a certain token is present in our constraints, simply add a emptry string, else path-to-regexp will throw 7 | for (let token of tokens) { 8 | if (typeof token === 'object' && !constraints[token.name]) { 9 | constraints[token.name] = ''; 10 | } 11 | } 12 | 13 | const pathFunction = tokensToFunction(tokens); 14 | const constrainedPath = pathFunction(constraints, { 15 | encode: (value, token) => ':' + token.name + value 16 | }); 17 | 18 | return constrainedPath; 19 | } 20 | -------------------------------------------------------------------------------- /src/util/trim.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Trim slashes of the left of a string 3 | * @param str 4 | * @returns {string} 5 | */ 6 | export function trim(str: string): string { 7 | return str.replace(/^\/|\/$/g, ''); 8 | } 9 | -------------------------------------------------------------------------------- /tests/torch.test.ts: -------------------------------------------------------------------------------- 1 | import {expect} from 'chai'; 2 | import {Application, NextFunction, Request, Response} from 'express'; 3 | 4 | import Router from '../src/router'; 5 | import Torch from '../src/torch'; 6 | 7 | describe('Torch', function () { 8 | 9 | describe('registering routes', function () { 10 | it('Should allow for registering a GET method directly', function () { 11 | /* Given */ 12 | let registeredPath: string|null = null; 13 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 14 | 15 | const app: any = { 16 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 17 | registeredPath = path; 18 | registeredMethod = method; 19 | } 20 | }; 21 | 22 | /* When */ 23 | const method = (req: any, res: any) => { 24 | /* The impl */ 25 | }; 26 | Torch(app as Application, (router: Router) => { 27 | router.get('/home', method); 28 | }); 29 | 30 | /* Then */ 31 | expect(registeredPath).to.equal('/home'); 32 | expect(registeredMethod).to.equal(method); 33 | }); 34 | 35 | it('Should allow for registering a POST method directly', function () { 36 | /* Given */ 37 | let registeredPath: string|null = null; 38 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 39 | 40 | const app: any = { 41 | post: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 42 | registeredPath = path; 43 | registeredMethod = method; 44 | } 45 | }; 46 | 47 | /* When */ 48 | const method = (req: any, res: any) => { 49 | /* The impl */ 50 | }; 51 | Torch(app as Application, (router: Router) => { 52 | router.post('/posts', method); 53 | }); 54 | 55 | /* Then */ 56 | expect(registeredPath).to.equal('/posts'); 57 | expect(registeredMethod).to.equal(method); 58 | }); 59 | 60 | it('Should allow for registering a PUT method directly', function () { 61 | /* Given */ 62 | let registeredPath: string|null = null; 63 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 64 | 65 | const app: any = { 66 | put: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 67 | registeredPath = path; 68 | registeredMethod = method; 69 | } 70 | }; 71 | 72 | /* When */ 73 | const method = (req: any, res: any) => { 74 | /* The impl */ 75 | }; 76 | Torch(app as Application, (router: Router) => { 77 | router.put('/posts/:id', method); 78 | }); 79 | 80 | /* Then */ 81 | expect(registeredPath).to.equal('/posts/:id'); 82 | expect(registeredMethod).to.equal(method); 83 | }); 84 | 85 | it('Should allow for registering a DELETE method directly', function () { 86 | /* Given */ 87 | let registeredPath: string|null = null; 88 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 89 | 90 | const app: any = { 91 | delete: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 92 | registeredPath = path; 93 | registeredMethod = method; 94 | } 95 | }; 96 | 97 | /* When */ 98 | const method = (req: any, res: any) => { 99 | /* The impl */ 100 | }; 101 | Torch(app as Application, (router: Router) => { 102 | router.delete('/posts/:id', method); 103 | }); 104 | 105 | /* Then */ 106 | expect(registeredPath).to.equal('/posts/:id'); 107 | expect(registeredMethod).to.equal(method); 108 | }); 109 | 110 | it('Should throw an error when trying to register an unkonown HTTP verb ', function () { 111 | /* Given */ 112 | let registeredPath: string|null = null; 113 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 114 | 115 | const app: any = { 116 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 117 | registeredPath = path; 118 | registeredMethod = method; 119 | } 120 | }; 121 | 122 | /* When */ 123 | let throwsAnError: boolean = false; 124 | const method = (req: any, res: any) => { 125 | /* The impl */ 126 | }; 127 | try { 128 | Torch(app as Application, (router: Router) => { 129 | router.get('/home', { 130 | controller: method, 131 | method: 'asdf' 132 | }); 133 | 134 | }); 135 | } catch (e) { 136 | throwsAnError = true; 137 | } 138 | 139 | /* Then */ 140 | expect(throwsAnError).to.equal(true); 141 | }); 142 | 143 | it('Should allow for registering by passing a config', function () { 144 | /* Given */ 145 | let registeredPath: string|null = null; 146 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 147 | 148 | const app: any = { 149 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 150 | registeredPath = path; 151 | registeredMethod = method; 152 | } 153 | }; 154 | 155 | /* When */ 156 | const method = (req: any, res: any) => { 157 | /* The impl */ 158 | }; 159 | Torch(app as Application, (router: Router) => { 160 | router.get('/home', { 161 | controller: method 162 | }); 163 | }); 164 | 165 | /* Then */ 166 | expect(registeredPath).to.equal('/home'); 167 | expect(registeredMethod).to.equal(method); 168 | }); 169 | 170 | it('Should add a leading / when registering a route without one', function () { 171 | /* Given */ 172 | let registeredPath: string|null = null; 173 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 174 | 175 | const app: any = { 176 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 177 | registeredPath = path; 178 | registeredMethod = method; 179 | } 180 | }; 181 | 182 | /* When */ 183 | const method = (req: any, res: any) => { 184 | /* The impl */ 185 | }; 186 | Torch(app as Application, (router: Router) => { 187 | router.get('home', method); 188 | }); 189 | 190 | /* Then */ 191 | expect(registeredPath).to.equal('/home'); 192 | expect(registeredMethod).to.equal(method); 193 | }); 194 | }); 195 | 196 | describe('grouping', function () { 197 | it('Should allow for registering a route within a group', function () { 198 | /* Given */ 199 | let registeredPath: string|null = null; 200 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 201 | 202 | const app: any = { 203 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 204 | registeredPath = path; 205 | registeredMethod = method; 206 | } 207 | }; 208 | 209 | /* When */ 210 | const method = (req: any, res: any) => { 211 | /* The impl */ 212 | }; 213 | Torch(app as Application, (router: Router) => { 214 | router.group({}, (router: Router) => { 215 | router.get('/home', method); 216 | }); 217 | }); 218 | 219 | /* Then */ 220 | expect(registeredPath).to.equal('/home'); 221 | expect(registeredMethod).to.equal(method); 222 | }); 223 | 224 | it('Should allow for registering a route within a group within a group', function () { 225 | /* Given */ 226 | let registeredPath: string|null = null; 227 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 228 | 229 | const app: any = { 230 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 231 | registeredPath = path; 232 | registeredMethod = method; 233 | } 234 | }; 235 | 236 | /* When */ 237 | const method = (req: any, res: any) => { 238 | /* The impl */ 239 | }; 240 | Torch(app as Application, (router: Router) => { 241 | router.group({}, (router: Router) => { 242 | router.group({}, (router: Router) => { 243 | router.get('/home', method); 244 | }); 245 | }); 246 | }); 247 | 248 | /* Then */ 249 | expect(registeredPath).to.equal('/home'); 250 | expect(registeredMethod).to.equal(method); 251 | }); 252 | 253 | it('Should allow for registering a route with a prefix from two groups with a path', function () { 254 | /* Given */ 255 | let registeredPath: string|null = null; 256 | 257 | const app: any = { 258 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 259 | registeredPath = path; 260 | } 261 | }; 262 | 263 | /* When */ 264 | const method = (req: any, res: any) => { 265 | /* The impl */ 266 | }; 267 | Torch(app as Application, (router: Router) => { 268 | router.group({prefix: 'api'}, (router: Router) => { 269 | router.group({prefix: 'posts'}, (router: Router) => { 270 | router.get('/:id/update', method); 271 | }); 272 | }); 273 | }); 274 | 275 | /* Then */ 276 | expect(registeredPath).to.equal('/api/posts/:id/update'); 277 | }); 278 | 279 | it('Should inherit prefix of higher group to lower group', function () { 280 | /* Given */ 281 | let registeredPath: string|null = null; 282 | 283 | const app: any = { 284 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 285 | registeredPath = path; 286 | } 287 | }; 288 | 289 | /* When */ 290 | const method = (req: any, res: any) => { 291 | /* The impl */ 292 | }; 293 | Torch(app as Application, (router: Router) => { 294 | router.group({prefix: 'api'}, (router: Router) => { 295 | router.group({}, (router: Router) => { 296 | router.get('/:id/update', method); 297 | }); 298 | }); 299 | }); 300 | 301 | /* Then */ 302 | expect(registeredPath).to.equal('/api/:id/update'); 303 | }); 304 | 305 | it('Should inherit prefix of multiple higher groups to lower group', function () { 306 | /* Given */ 307 | let registeredPath: string|null = null; 308 | 309 | const app: any = { 310 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 311 | registeredPath = path; 312 | } 313 | }; 314 | 315 | /* When */ 316 | const method = (req: any, res: any) => { 317 | /* The impl */ 318 | }; 319 | Torch(app as Application, (router: Router) => { 320 | router.group({prefix: 'api'}, (router: Router) => { 321 | router.group({}, (router: Router) => { 322 | router.group({}, (router: Router) => { 323 | router.get('/:id/update', method); 324 | }); 325 | }); 326 | }); 327 | }); 328 | 329 | /* Then */ 330 | expect(registeredPath).to.equal('/api/:id/update'); 331 | }); 332 | 333 | it('Should allow for registering a route with a prefix from two groups without a path', function () { 334 | /* Given */ 335 | let registeredPath: string|null = null; 336 | 337 | const app: any = { 338 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 339 | registeredPath = path; 340 | } 341 | }; 342 | 343 | /* When */ 344 | const method = (req: any, res: any) => { 345 | /* The impl */ 346 | }; 347 | Torch(app as Application, (router: Router) => { 348 | router.group({prefix: 'api'}, (router: Router) => { 349 | router.group({prefix: 'posts'}, (router: Router) => { 350 | router.get('/', method); 351 | }); 352 | }); 353 | }); 354 | 355 | /* Then */ 356 | expect(registeredPath).to.equal('/api/posts'); 357 | }); 358 | 359 | it('Should pass the middleware', function () { 360 | /* Given */ 361 | let registeredMiddleware: (Array<(req: Request, res: Response, next: NextFunction) => any>) = []; 362 | 363 | const app: any = { 364 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 365 | registeredMiddleware = middleware; 366 | } 367 | }; 368 | 369 | /* When */ 370 | const middleware = (req: any, res: any, next: any) => { 371 | /* The impl */ 372 | }; 373 | const method = (req: any, res: any) => { 374 | /* The impl */ 375 | }; 376 | Torch(app as Application, (router: Router) => { 377 | router.get('/home', { 378 | middleware: [middleware], 379 | controller: method 380 | }); 381 | }); 382 | 383 | /* Then */ 384 | expect(registeredMiddleware[1]).to.equal(middleware); 385 | }); 386 | 387 | it('Should add middleware from the group', function () { 388 | /* Given */ 389 | let registeredMiddleware: (Array<(req: Request, res: Response, next: NextFunction) => any>) = []; 390 | 391 | const app: any = { 392 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 393 | registeredMiddleware = middleware; 394 | } 395 | }; 396 | 397 | /* When */ 398 | const middleware = (req: any, res: any, next: any) => { 399 | /* The impl */ 400 | }; 401 | const method = (req: any, res: any) => { 402 | /* The impl */ 403 | }; 404 | Torch(app as Application, (router: Router) => { 405 | router.group({middleware: [middleware]}, (router: Router) => { 406 | router.get('/home', method); 407 | }); 408 | }); 409 | 410 | /* Then */ 411 | expect(registeredMiddleware[1]).to.equal(middleware); 412 | }); 413 | 414 | it('Should inherit middleware from distant group', function () { 415 | /* Given */ 416 | let registeredMiddleware: (Array<(req: Request, res: Response, next: NextFunction) => any>) = []; 417 | 418 | const app: any = { 419 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 420 | registeredMiddleware = middleware; 421 | } 422 | }; 423 | 424 | /* When */ 425 | const middleware = (req: any, res: any, next: any) => { 426 | /* The impl */ 427 | }; 428 | const method = (req: any, res: any) => { 429 | /* The impl */ 430 | }; 431 | Torch(app as Application, (router: Router) => { 432 | router.group({middleware: [middleware]}, (router: Router) => { 433 | router.group({}, (router: Router) => { 434 | router.get('/home', method); 435 | }); 436 | }); 437 | }); 438 | 439 | /* Then */ 440 | expect(registeredMiddleware[1]).to.equal(middleware); 441 | }); 442 | 443 | it('Should add middlewares in correct order', function () { 444 | /* Given */ 445 | let registeredMiddleware: (Array<(req: Request, res: Response, next: NextFunction) => any>) = []; 446 | 447 | const app: any = { 448 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 449 | registeredMiddleware = middleware; 450 | } 451 | }; 452 | 453 | /* When */ 454 | const a = (req: any, res: any, next: any) => { 455 | /* The impl */ 456 | }; 457 | const b = (req: any, res: any, next: any) => { 458 | /* The impl */ 459 | }; 460 | const c = (req: any, res: any, next: any) => { 461 | /* The impl */ 462 | }; 463 | const method = (req: any, res: any) => { 464 | /* The impl */ 465 | }; 466 | Torch(app as Application, (router: Router) => { 467 | router.group({middleware: [a]}, (router: Router) => { 468 | router.group({middleware: [b]}, (router: Router) => { 469 | router.get('/home', { 470 | middleware: [c], 471 | controller: method 472 | }); 473 | }); 474 | }); 475 | }); 476 | 477 | /* Then */ 478 | expect(registeredMiddleware[1]).to.equal(a); 479 | expect(registeredMiddleware[2]).to.equal(b); 480 | expect(registeredMiddleware[3]).to.equal(c); 481 | }); 482 | }); 483 | 484 | describe('aggregated routes, i.e. Torches\' result', function () { 485 | 486 | it('should have flattened groups', function () { 487 | /* Given */ 488 | const app: any = { 489 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 490 | } 491 | }; 492 | 493 | const routes = Torch(app as Application, (router: Router) => { 494 | router.group({prefix: '/api'}, function (router) { 495 | router.get('/posts', (req: any, res: any) => { 496 | /* The impl */ 497 | }); 498 | }); 499 | }); 500 | 501 | /* When */ 502 | const result = routes.all(); 503 | 504 | /* Then */ 505 | expect(result).have.lengthOf(1); 506 | expect(result[0].path).to.equal('/api/posts'); 507 | }); 508 | 509 | describe('named', function () { 510 | it('should resolve route without arguments', function () { 511 | /* Given */ 512 | const app: any = { 513 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 514 | } 515 | }; 516 | 517 | const routes = Torch(app as Application, (router: Router) => { 518 | router.get('/my-page', { 519 | name: 'home', 520 | controller: (req: any, res: any) => { 521 | /* The impl */ 522 | } 523 | }); 524 | }); 525 | 526 | /* When */ 527 | const result = routes.named('home'); 528 | 529 | /* Then */ 530 | expect(result).to.equal('/my-page'); 531 | }); 532 | it('should resolve route with arguments', function () { 533 | /* Given */ 534 | const app: any = { 535 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 536 | } 537 | }; 538 | 539 | const routes = Torch(app as Application, (router: Router) => { 540 | router.get('/posts/:id', { 541 | name: 'posts.show', 542 | controller: (req: any, res: any) => { 543 | /* The impl */ 544 | } 545 | }); 546 | }); 547 | 548 | /* When */ 549 | const result = routes.named('posts.show', { 550 | id: 123 551 | }); 552 | 553 | /* Then */ 554 | expect(result).to.equal('/posts/123'); 555 | }); 556 | it('should find the correct path', function () { 557 | /* Given */ 558 | const app: any = { 559 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 560 | } 561 | }; 562 | 563 | const routes = Torch(app as Application, (router: Router) => { 564 | router.get('/posts', { 565 | name: 'posts.index', 566 | controller: (req: any, res: any) => { 567 | /* The impl */ 568 | } 569 | }); 570 | router.get('/posts/:id', { 571 | name: 'posts.show', 572 | controller: (req: any, res: any) => { 573 | /* The impl */ 574 | } 575 | }); 576 | }); 577 | 578 | /* When */ 579 | const result = routes.named('posts.show', { 580 | id: 123 581 | }); 582 | 583 | /* Then */ 584 | expect(result).to.equal('/posts/123'); 585 | }); 586 | it('should add middleware to request to find path', function () { 587 | /* Given */ 588 | let registeredMiddlewares: Array<(req: Request, res: Response, next: NextFunction) => any> = []; 589 | const app: any = { 590 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 591 | registeredMiddlewares = middleware; 592 | } 593 | }; 594 | 595 | const routes = Torch(app as Application, (router: Router) => { 596 | router.get('/home', { 597 | name: 'home', 598 | controller: (req: any, res: any) => { 599 | /* The impl */ 600 | } 601 | }); 602 | }); 603 | 604 | /* When */ 605 | const req: any = {}; 606 | const res: any = {}; 607 | for (var i = 0; i < registeredMiddlewares.length; i++) { 608 | registeredMiddlewares[i](req, res, () => { 609 | }); 610 | } 611 | const result = req.routes.named('home'); 612 | 613 | /* Then */ 614 | expect(result).to.equal('/home'); 615 | }); 616 | }); 617 | }); 618 | 619 | describe('Should allow placing constraints on a route its variables by using .where() on a route', function () { 620 | it('should accept constraints', function () { 621 | /* Given */ 622 | let registeredPath: string | null = null; 623 | let registeredMethod: ((req: Request, res: Response) => void) | null = null; 624 | 625 | const app: any = { 626 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 627 | registeredPath = path; 628 | registeredMethod = method; 629 | } 630 | }; 631 | 632 | /* When */ 633 | const method = (req: any, res: any) => { 634 | /* The impl */ 635 | }; 636 | Torch(app as Application, (router: Router) => { 637 | router.get('/home/:id', method).where({ 638 | 'id': '(\\d+)' 639 | }); 640 | }); 641 | 642 | /* Then */ 643 | expect(registeredPath).to.equal('/home/:id(\\d+)'); 644 | expect(registeredMethod).to.equal(method); 645 | }); 646 | 647 | it('should accept multiple constraints', function () { 648 | /* Given */ 649 | let registeredPath: string | null = null; 650 | let registeredMethod: ((req: Request, res: Response) => void) | null = null; 651 | 652 | const app: any = { 653 | post: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 654 | registeredPath = path; 655 | registeredMethod = method; 656 | } 657 | }; 658 | 659 | /* When */ 660 | const method = (req: any, res: any) => { 661 | /* The impl */ 662 | }; 663 | Torch(app as Application, (router: Router) => { 664 | router.post('/home/:id/:postId', method).where({ 665 | 'id': '(\\d+)', 666 | 'postId': '(1|2|3)' 667 | }); 668 | }); 669 | 670 | /* Then */ 671 | expect(registeredPath).to.equal('/home/:id(\\d+)/:postId(1|2|3)'); 672 | expect(registeredMethod).to.equal(method); 673 | }); 674 | 675 | it('should accept multiple constraints spanning multiple groups of variables', function () { 676 | /* Given */ 677 | let registeredPath: string | null = null; 678 | let registeredMethod: ((req: Request, res: Response) => void) | null = null; 679 | 680 | const app: any = { 681 | put: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 682 | registeredPath = path; 683 | registeredMethod = method; 684 | } 685 | }; 686 | 687 | /* When */ 688 | const method = (req: any, res: any) => { 689 | /* The impl */ 690 | }; 691 | Torch(app as Application, (router: Router) => { 692 | router.group({ prefix: ':foo' }, router => { 693 | router.group({ prefix: '/:bar' }, router => { 694 | router.put('/home/:id/:postId', method).where({ 695 | 'id': '(\\d+)', 696 | 'postId': '(1|2|3)', 697 | 'foo': '[0-9]+', 698 | 'bar': '[a-b]' 699 | }); 700 | }); 701 | }); 702 | }); 703 | 704 | /* Then */ 705 | expect(registeredPath).to.equal('/:foo[0-9]+/:bar[a-b]/home/:id(\\d+)/:postId(1|2|3)'); 706 | expect(registeredMethod).to.equal(method); 707 | }); 708 | 709 | it('should not screw up the route if unmet constraints are added', function () { 710 | /* Given */ 711 | let registeredPath: string | null = null; 712 | let registeredMethod: ((req: Request, res: Response) => void) | null = null; 713 | 714 | const app: any = { 715 | delete: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 716 | registeredPath = path; 717 | registeredMethod = method; 718 | } 719 | }; 720 | 721 | /* When */ 722 | const method = (req: any, res: any) => { 723 | /* The impl */ 724 | }; 725 | Torch(app as Application, (router: Router) => { 726 | router.delete('/:id/:postId', method).where({ 727 | 'id': '(\\d+)', 728 | 'postId': '(1|2|3)', 729 | 'foo': '[0-9]+' 730 | }); 731 | }); 732 | 733 | /* Then */ 734 | expect(registeredPath).to.equal('/:id(\\d+)/:postId(1|2|3)'); 735 | expect(registeredMethod).to.equal(method); 736 | }); 737 | 738 | it('should not screw up if the order of variables is confusing', function () { 739 | /* Given */ 740 | let registeredPath: string | null = null; 741 | let registeredMethod: ((req: Request, res: Response) => void) | null = null; 742 | 743 | const app: any = { 744 | delete: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 745 | registeredPath = path; 746 | registeredMethod = method; 747 | } 748 | }; 749 | 750 | /* When */ 751 | const method = (req: any, res: any) => { 752 | /* The impl */ 753 | }; 754 | Torch(app as Application, (router: Router) => { 755 | router.delete('/:identifier/:id', method).where({ 756 | 'id': '(\\d+)', 757 | 'identifier': '(\\d+)' 758 | }); 759 | }); 760 | 761 | /* Then */ 762 | expect(registeredPath).to.equal('/:identifier(\\d+)/:id(\\d+)'); 763 | expect(registeredMethod).to.equal(method); 764 | }); 765 | 766 | it('should leave a token alone if no constraint is specified', function () { 767 | /* Given */ 768 | let registeredPath: string | null = null; 769 | let registeredMethod: ((req: Request, res: Response) => void) | null = null; 770 | 771 | const app: any = { 772 | delete: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 773 | registeredPath = path; 774 | registeredMethod = method; 775 | } 776 | }; 777 | 778 | /* When */ 779 | const method = (req: any, res: any) => { 780 | /* The impl */ 781 | }; 782 | Torch(app as Application, (router: Router) => { 783 | router.delete('/:identifier/:id', method).where({ 784 | 'id': '(\\d+)' 785 | }); 786 | }); 787 | 788 | /* Then */ 789 | expect(registeredPath).to.equal('/:identifier/:id(\\d+)'); 790 | expect(registeredMethod).to.equal(method); 791 | }); 792 | }); 793 | 794 | describe('Binding routes to Express', function() { 795 | describe('Context', function () { 796 | it('Should be able to define on route level', function () { 797 | 798 | /* Given */ 799 | type myMetaData = { blaat: string }; 800 | 801 | let registeredPath: string|null = null; 802 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 803 | 804 | const app: any = { 805 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 806 | registeredPath = path; 807 | registeredMethod = method; 808 | } 809 | }; 810 | 811 | class Foo { 812 | private test = 'hello'; 813 | 814 | public method(req: Request, res: Response) { 815 | return this.test; 816 | } 817 | } 818 | const fooInstance = new Foo(); 819 | 820 | /* When */ 821 | const routes = Torch(app as Application, (router) => { 822 | router.get('/home', { 823 | controller: fooInstance.method, 824 | context: fooInstance 825 | }); 826 | }); 827 | 828 | /* Then */ 829 | expect(registeredPath).to.equal('/home'); 830 | expect((registeredMethod as any)(1 as any, 2 as any)).to.equal('hello'); 831 | }); 832 | it('Should be able to define at group level', function () { 833 | 834 | /* Given */ 835 | type myMetaData = { blaat: string }; 836 | 837 | let registeredPath: string|null = null; 838 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 839 | 840 | const app: any = { 841 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 842 | registeredPath = path; 843 | registeredMethod = method; 844 | } 845 | }; 846 | 847 | class Foo { 848 | private test = 'hello'; 849 | 850 | public method(req: Request, res: Response) { 851 | return this.test; 852 | } 853 | } 854 | const fooInstance = new Foo(); 855 | 856 | /* When */ 857 | const routes = Torch(app as Application, (router) => { 858 | router.group({ context: fooInstance }, (aRouter) => { 859 | aRouter.get('/home', fooInstance.method); 860 | }); 861 | }); 862 | 863 | /* Then */ 864 | expect(registeredPath).to.equal('/home'); 865 | expect((registeredMethod as any)(1 as any, 2 as any)).to.equal('hello'); 866 | }); 867 | it('Should inherit over groups', function () { 868 | 869 | /* Given */ 870 | type myMetaData = { blaat: string }; 871 | 872 | let registeredPath: string|null = null; 873 | let registeredMethod: ((req: Request, res: Response) => void)|null = null; 874 | 875 | const app: any = { 876 | get: (path: string, middleware: Array<(req: Request, res: Response, next: NextFunction) => any>, method: ((req: Request, res: Response) => void)) => { 877 | registeredPath = path; 878 | registeredMethod = method; 879 | } 880 | }; 881 | 882 | class Foo { 883 | private test = 'hello'; 884 | 885 | public method(req: Request, res: Response) { 886 | return this.test; 887 | } 888 | } 889 | const fooInstance = new Foo(); 890 | 891 | /* When */ 892 | const routes = Torch(app as Application, (router) => { 893 | router.group({ context: fooInstance }, (aRouter) => { 894 | aRouter.group({ }, (bRouter) => { 895 | bRouter.get('/home', fooInstance.method); 896 | }); 897 | }); 898 | }); 899 | 900 | /* Then */ 901 | expect(registeredPath).to.equal('/home'); 902 | expect((registeredMethod as any)(1 as any, 2 as any)).to.equal('hello'); 903 | }); 904 | }); 905 | }); 906 | }); 907 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./build", 4 | "sourceMap": true, 5 | "moduleResolution": "node", 6 | "module": "commonjs", 7 | "target": "es5", 8 | "strictNullChecks": true 9 | }, 10 | "files": [ 11 | "./src/torch.ts" 12 | ] 13 | } -------------------------------------------------------------------------------- /tsconfig.test.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "sourceMap": true, 4 | "moduleResolution": "node", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "strictNullChecks": true 8 | }, 9 | "files": [ 10 | "./tests/torch.test.ts" 11 | ] 12 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:recommended", 3 | "rules": { 4 | "curly": true, 5 | "object-literal-sort-keys": false, 6 | "ordered-imports": false, 7 | "quotemark": "single", 8 | "trailing-comma": false, 9 | "variable-name": [ 10 | true, 11 | "allow-leading-underscore" 12 | ], 13 | "interface-name": false, 14 | "triple-equals": true 15 | } 16 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/chai": 6 | version "3.4.34" 7 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-3.4.34.tgz#d5335792823bb09cddd5e38c3d211b709183854d" 8 | 9 | "@types/expect.js": 10 | version "0.3.29" 11 | resolved "https://registry.yarnpkg.com/@types/expect.js/-/expect.js-0.3.29.tgz#28dd359155b84b8ecb094afc3f4b74c3222dca3b" 12 | 13 | "@types/express": 14 | version "4.0.33" 15 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.33.tgz#9212b6c67e02e09ee9f80740ded04306050739ab" 16 | dependencies: 17 | "@types/express-serve-static-core" "*" 18 | "@types/serve-static" "*" 19 | 20 | "@types/express-serve-static-core@*": 21 | version "4.0.39" 22 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.39.tgz#45157f96480d46f254648f45b2c6d70bd9fc9f54" 23 | dependencies: 24 | "@types/node" "*" 25 | 26 | "@types/mime@*": 27 | version "0.0.29" 28 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" 29 | 30 | "@types/mocha": 31 | version "2.2.32" 32 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.32.tgz#dda0da6eaf2195d2ff808f42a1725b1a19e7ed69" 33 | 34 | "@types/node@*": 35 | version "6.0.46" 36 | resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.46.tgz#8d9e48572831f05b11cc4c793754d43437219d62" 37 | 38 | "@types/serve-static@*": 39 | version "1.7.31" 40 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.7.31.tgz#15456de8d98d6b4cff31be6c6af7492ae63f521a" 41 | dependencies: 42 | "@types/express-serve-static-core" "*" 43 | "@types/mime" "*" 44 | 45 | align-text@^0.1.1, align-text@^0.1.3: 46 | version "0.1.4" 47 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 48 | dependencies: 49 | kind-of "^3.0.2" 50 | longest "^1.0.1" 51 | repeat-string "^1.5.2" 52 | 53 | amdefine@>=0.0.4: 54 | version "1.0.0" 55 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" 56 | 57 | ansi-align@^1.1.0: 58 | version "1.1.0" 59 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" 60 | dependencies: 61 | string-width "^1.0.1" 62 | 63 | ansi-regex@^2.0.0: 64 | version "2.0.0" 65 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 66 | 67 | ansi-styles@^2.2.1: 68 | version "2.2.1" 69 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 70 | 71 | append-transform@^0.3.0: 72 | version "0.3.0" 73 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.3.0.tgz#d6933ce4a85f09445d9ccc4cc119051b7381a813" 74 | 75 | archy@^1.0.0: 76 | version "1.0.0" 77 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 78 | 79 | arr-diff@^2.0.0: 80 | version "2.0.0" 81 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 82 | dependencies: 83 | arr-flatten "^1.0.1" 84 | 85 | arr-flatten@^1.0.1: 86 | version "1.0.1" 87 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 88 | 89 | array-unique@^0.2.1: 90 | version "0.2.1" 91 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 92 | 93 | arrify@^1.0.1: 94 | version "1.0.1" 95 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 96 | 97 | assertion-error@^1.0.1: 98 | version "1.0.2" 99 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 100 | 101 | async@^1.4.0, async@^1.4.2: 102 | version "1.5.2" 103 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 104 | 105 | async@~0.2.6: 106 | version "0.2.10" 107 | resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" 108 | 109 | babel-code-frame@^6.16.0: 110 | version "6.16.0" 111 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" 112 | dependencies: 113 | chalk "^1.1.0" 114 | esutils "^2.0.2" 115 | js-tokens "^2.0.0" 116 | 117 | babel-code-frame@^6.20.0: 118 | version "6.20.0" 119 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" 120 | dependencies: 121 | chalk "^1.1.0" 122 | esutils "^2.0.2" 123 | js-tokens "^2.0.0" 124 | 125 | babel-generator@^6.18.0: 126 | version "6.18.0" 127 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.18.0.tgz#e4f104cb3063996d9850556a45aae4a022060a07" 128 | dependencies: 129 | babel-messages "^6.8.0" 130 | babel-runtime "^6.9.0" 131 | babel-types "^6.18.0" 132 | detect-indent "^4.0.0" 133 | jsesc "^1.3.0" 134 | lodash "^4.2.0" 135 | source-map "^0.5.0" 136 | 137 | babel-messages@^6.8.0: 138 | version "6.8.0" 139 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" 140 | dependencies: 141 | babel-runtime "^6.0.0" 142 | 143 | babel-runtime@^6.0.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: 144 | version "6.18.0" 145 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" 146 | dependencies: 147 | core-js "^2.4.0" 148 | regenerator-runtime "^0.9.5" 149 | 150 | babel-template@^6.16.0: 151 | version "6.16.0" 152 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" 153 | dependencies: 154 | babel-runtime "^6.9.0" 155 | babel-traverse "^6.16.0" 156 | babel-types "^6.16.0" 157 | babylon "^6.11.0" 158 | lodash "^4.2.0" 159 | 160 | babel-traverse@^6.16.0, babel-traverse@^6.18.0: 161 | version "6.18.0" 162 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.18.0.tgz#5aeaa980baed2a07c8c47329cd90c3b90c80f05e" 163 | dependencies: 164 | babel-code-frame "^6.16.0" 165 | babel-messages "^6.8.0" 166 | babel-runtime "^6.9.0" 167 | babel-types "^6.18.0" 168 | babylon "^6.11.0" 169 | debug "^2.2.0" 170 | globals "^9.0.0" 171 | invariant "^2.2.0" 172 | lodash "^4.2.0" 173 | 174 | babel-types@^6.16.0, babel-types@^6.18.0: 175 | version "6.18.0" 176 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.18.0.tgz#1f7d5a73474c59eb9151b2417bbff4e4fce7c3f8" 177 | dependencies: 178 | babel-runtime "^6.9.1" 179 | esutils "^2.0.2" 180 | lodash "^4.2.0" 181 | to-fast-properties "^1.0.1" 182 | 183 | babylon@^6.11.0, babylon@^6.13.0: 184 | version "6.13.1" 185 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.13.1.tgz#adca350e088f0467647157652bafead6ddb8dfdb" 186 | 187 | balanced-match@^0.4.1: 188 | version "0.4.2" 189 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 190 | 191 | boxen@^0.6.0: 192 | version "0.6.0" 193 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" 194 | dependencies: 195 | ansi-align "^1.1.0" 196 | camelcase "^2.1.0" 197 | chalk "^1.1.1" 198 | cli-boxes "^1.0.0" 199 | filled-array "^1.0.0" 200 | object-assign "^4.0.1" 201 | repeating "^2.0.0" 202 | string-width "^1.0.1" 203 | widest-line "^1.0.0" 204 | 205 | brace-expansion@^1.0.0: 206 | version "1.1.6" 207 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 208 | dependencies: 209 | balanced-match "^0.4.1" 210 | concat-map "0.0.1" 211 | 212 | braces@^1.8.2: 213 | version "1.8.5" 214 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 215 | dependencies: 216 | expand-range "^1.8.1" 217 | preserve "^0.2.0" 218 | repeat-element "^1.1.2" 219 | 220 | browser-stdout@1.3.0: 221 | version "1.3.0" 222 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 223 | 224 | buffer-shims@^1.0.0: 225 | version "1.0.0" 226 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 227 | 228 | builtin-modules@^1.0.0: 229 | version "1.1.1" 230 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 231 | 232 | caching-transform@^1.0.0: 233 | version "1.0.1" 234 | resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" 235 | dependencies: 236 | md5-hex "^1.2.0" 237 | mkdirp "^0.5.1" 238 | write-file-atomic "^1.1.4" 239 | 240 | camelcase@^1.0.2: 241 | version "1.2.1" 242 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 243 | 244 | camelcase@^2.1.0: 245 | version "2.1.1" 246 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 247 | 248 | camelcase@^3.0.0: 249 | version "3.0.0" 250 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 251 | 252 | capture-stack-trace@^1.0.0: 253 | version "1.0.0" 254 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 255 | 256 | center-align@^0.1.1: 257 | version "0.1.3" 258 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 259 | dependencies: 260 | align-text "^0.1.3" 261 | lazy-cache "^1.0.3" 262 | 263 | chai: 264 | version "3.5.0" 265 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 266 | dependencies: 267 | assertion-error "^1.0.1" 268 | deep-eql "^0.1.3" 269 | type-detect "^1.0.0" 270 | 271 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: 272 | version "1.1.3" 273 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 274 | dependencies: 275 | ansi-styles "^2.2.1" 276 | escape-string-regexp "^1.0.2" 277 | has-ansi "^2.0.0" 278 | strip-ansi "^3.0.0" 279 | supports-color "^2.0.0" 280 | 281 | cli-boxes@^1.0.0: 282 | version "1.0.0" 283 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 284 | 285 | cliui@^2.1.0: 286 | version "2.1.0" 287 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 288 | dependencies: 289 | center-align "^0.1.1" 290 | right-align "^0.1.1" 291 | wordwrap "0.0.2" 292 | 293 | cliui@^3.2.0: 294 | version "3.2.0" 295 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 296 | dependencies: 297 | string-width "^1.0.1" 298 | strip-ansi "^3.0.1" 299 | wrap-ansi "^2.0.0" 300 | 301 | code-point-at@^1.0.0: 302 | version "1.0.1" 303 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.0.1.tgz#1104cd34f9b5b45d3eba88f1babc1924e1ce35fb" 304 | dependencies: 305 | number-is-nan "^1.0.0" 306 | 307 | colors@^1.1.2: 308 | version "1.1.2" 309 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 310 | 311 | commander@2.9.0, commander@^2.9.0: 312 | version "2.9.0" 313 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 314 | dependencies: 315 | graceful-readlink ">= 1.0.0" 316 | 317 | commondir@^1.0.1: 318 | version "1.0.1" 319 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 320 | 321 | concat-map@0.0.1: 322 | version "0.0.1" 323 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 324 | 325 | configstore@^2.0.0: 326 | version "2.1.0" 327 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" 328 | dependencies: 329 | dot-prop "^3.0.0" 330 | graceful-fs "^4.1.2" 331 | mkdirp "^0.5.0" 332 | object-assign "^4.0.1" 333 | os-tmpdir "^1.0.0" 334 | osenv "^0.1.0" 335 | uuid "^2.0.1" 336 | write-file-atomic "^1.1.2" 337 | xdg-basedir "^2.0.0" 338 | 339 | convert-source-map@^1.3.0: 340 | version "1.3.0" 341 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" 342 | 343 | core-js@^2.4.0: 344 | version "2.4.1" 345 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 346 | 347 | core-util-is@~1.0.0: 348 | version "1.0.2" 349 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 350 | 351 | create-error-class@^3.0.1: 352 | version "3.0.2" 353 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 354 | dependencies: 355 | capture-stack-trace "^1.0.0" 356 | 357 | cross-spawn@^4: 358 | version "4.0.2" 359 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" 360 | dependencies: 361 | lru-cache "^4.0.1" 362 | which "^1.2.9" 363 | 364 | debug@2.2.0, debug@^2.2.0: 365 | version "2.2.0" 366 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 367 | dependencies: 368 | ms "0.7.1" 369 | 370 | decamelize@^1.0.0, decamelize@^1.1.1: 371 | version "1.2.0" 372 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 373 | 374 | deep-eql@^0.1.3: 375 | version "0.1.3" 376 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 377 | dependencies: 378 | type-detect "0.1.1" 379 | 380 | deep-extend@~0.4.0: 381 | version "0.4.1" 382 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 383 | 384 | default-require-extensions@^1.0.0: 385 | version "1.0.0" 386 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" 387 | dependencies: 388 | strip-bom "^2.0.0" 389 | 390 | detect-indent@^0.2.0: 391 | version "0.2.0" 392 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-0.2.0.tgz#042914498979ac2d9f3c73e4ff3e6877d3bc92b6" 393 | dependencies: 394 | get-stdin "^0.1.0" 395 | minimist "^0.1.0" 396 | 397 | detect-indent@^4.0.0: 398 | version "4.0.0" 399 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 400 | dependencies: 401 | repeating "^2.0.0" 402 | 403 | diff@1.4.0: 404 | version "1.4.0" 405 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 406 | 407 | diff@^3.0.1: 408 | version "3.2.0" 409 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 410 | 411 | dot-prop@^3.0.0: 412 | version "3.0.0" 413 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" 414 | dependencies: 415 | is-obj "^1.0.0" 416 | 417 | dts-bundle: 418 | version "0.6.1" 419 | resolved "https://registry.yarnpkg.com/dts-bundle/-/dts-bundle-0.6.1.tgz#a677bf399000f216f58123a1e3c38340d35d0b72" 420 | dependencies: 421 | commander "^2.9.0" 422 | detect-indent "^0.2.0" 423 | glob "^6.0.4" 424 | mkdirp "^0.5.0" 425 | 426 | duplexer2@^0.1.4: 427 | version "0.1.4" 428 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 429 | dependencies: 430 | readable-stream "^2.0.2" 431 | 432 | error-ex@^1.2.0: 433 | version "1.3.0" 434 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" 435 | dependencies: 436 | is-arrayish "^0.2.1" 437 | 438 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: 439 | version "1.0.5" 440 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 441 | 442 | esutils@^2.0.2: 443 | version "2.0.2" 444 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 445 | 446 | expand-brackets@^0.1.4: 447 | version "0.1.5" 448 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 449 | dependencies: 450 | is-posix-bracket "^0.1.0" 451 | 452 | expand-range@^1.8.1: 453 | version "1.8.2" 454 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 455 | dependencies: 456 | fill-range "^2.1.0" 457 | 458 | extglob@^0.3.1: 459 | version "0.3.2" 460 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 461 | dependencies: 462 | is-extglob "^1.0.0" 463 | 464 | filename-regex@^2.0.0: 465 | version "2.0.0" 466 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 467 | 468 | fill-range@^2.1.0: 469 | version "2.2.3" 470 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 471 | dependencies: 472 | is-number "^2.1.0" 473 | isobject "^2.0.0" 474 | randomatic "^1.1.3" 475 | repeat-element "^1.1.2" 476 | repeat-string "^1.5.2" 477 | 478 | filled-array@^1.0.0: 479 | version "1.1.0" 480 | resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" 481 | 482 | find-cache-dir@^0.1.1: 483 | version "0.1.1" 484 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" 485 | dependencies: 486 | commondir "^1.0.1" 487 | mkdirp "^0.5.1" 488 | pkg-dir "^1.0.0" 489 | 490 | find-up@^1.0.0, find-up@^1.1.2: 491 | version "1.1.2" 492 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 493 | dependencies: 494 | path-exists "^2.0.0" 495 | pinkie-promise "^2.0.0" 496 | 497 | findup-sync@~0.3.0: 498 | version "0.3.0" 499 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" 500 | dependencies: 501 | glob "~5.0.0" 502 | 503 | for-in@^0.1.5: 504 | version "0.1.6" 505 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 506 | 507 | for-own@^0.1.4: 508 | version "0.1.4" 509 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 510 | dependencies: 511 | for-in "^0.1.5" 512 | 513 | foreground-child@^1.3.3, foreground-child@^1.5.3: 514 | version "1.5.3" 515 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.3.tgz#94dd6aba671389867de8e57e99f1c2ecfb15c01a" 516 | dependencies: 517 | cross-spawn "^4" 518 | signal-exit "^3.0.0" 519 | 520 | fs.realpath@^1.0.0: 521 | version "1.0.0" 522 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 523 | 524 | get-caller-file@^1.0.1: 525 | version "1.0.2" 526 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 527 | 528 | get-stdin@^0.1.0: 529 | version "0.1.0" 530 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-0.1.0.tgz#5998af24aafc802d15c82c685657eeb8b10d4a91" 531 | 532 | glob-base@^0.3.0: 533 | version "0.3.0" 534 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 535 | dependencies: 536 | glob-parent "^2.0.0" 537 | is-glob "^2.0.0" 538 | 539 | glob-parent@^2.0.0: 540 | version "2.0.0" 541 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 542 | dependencies: 543 | is-glob "^2.0.0" 544 | 545 | glob@7.0.5: 546 | version "7.0.5" 547 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" 548 | dependencies: 549 | fs.realpath "^1.0.0" 550 | inflight "^1.0.4" 551 | inherits "2" 552 | minimatch "^3.0.2" 553 | once "^1.3.0" 554 | path-is-absolute "^1.0.0" 555 | 556 | glob@^6.0.4: 557 | version "6.0.4" 558 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 559 | dependencies: 560 | inflight "^1.0.4" 561 | inherits "2" 562 | minimatch "2 || 3" 563 | once "^1.3.0" 564 | path-is-absolute "^1.0.0" 565 | 566 | glob@^7.0.5, glob@^7.0.6, glob@^7.1.1: 567 | version "7.1.1" 568 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 569 | dependencies: 570 | fs.realpath "^1.0.0" 571 | inflight "^1.0.4" 572 | inherits "2" 573 | minimatch "^3.0.2" 574 | once "^1.3.0" 575 | path-is-absolute "^1.0.0" 576 | 577 | glob@~5.0.0: 578 | version "5.0.15" 579 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 580 | dependencies: 581 | inflight "^1.0.4" 582 | inherits "2" 583 | minimatch "2 || 3" 584 | once "^1.3.0" 585 | path-is-absolute "^1.0.0" 586 | 587 | globals@^9.0.0: 588 | version "9.12.0" 589 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.12.0.tgz#992ce90828c3a55fa8f16fada177adb64664cf9d" 590 | 591 | got@^5.0.0: 592 | version "5.7.1" 593 | resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" 594 | dependencies: 595 | create-error-class "^3.0.1" 596 | duplexer2 "^0.1.4" 597 | is-redirect "^1.0.0" 598 | is-retry-allowed "^1.0.0" 599 | is-stream "^1.0.0" 600 | lowercase-keys "^1.0.0" 601 | node-status-codes "^1.0.0" 602 | object-assign "^4.0.1" 603 | parse-json "^2.1.0" 604 | pinkie-promise "^2.0.0" 605 | read-all-stream "^3.0.0" 606 | readable-stream "^2.0.5" 607 | timed-out "^3.0.0" 608 | unzip-response "^1.0.2" 609 | url-parse-lax "^1.0.0" 610 | 611 | graceful-fs@^4.1.2: 612 | version "4.1.9" 613 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.9.tgz#baacba37d19d11f9d146d3578bc99958c3787e29" 614 | 615 | "graceful-readlink@>= 1.0.0": 616 | version "1.0.1" 617 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 618 | 619 | growl@1.9.2: 620 | version "1.9.2" 621 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 622 | 623 | handlebars@^4.0.3: 624 | version "4.0.5" 625 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7" 626 | dependencies: 627 | async "^1.4.0" 628 | optimist "^0.6.1" 629 | source-map "^0.4.4" 630 | optionalDependencies: 631 | uglify-js "^2.6" 632 | 633 | has-ansi@^2.0.0: 634 | version "2.0.0" 635 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 636 | dependencies: 637 | ansi-regex "^2.0.0" 638 | 639 | has-flag@^1.0.0: 640 | version "1.0.0" 641 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 642 | 643 | hosted-git-info@^2.1.4: 644 | version "2.1.5" 645 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" 646 | 647 | imurmurhash@^0.1.4: 648 | version "0.1.4" 649 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 650 | 651 | inflight@^1.0.4: 652 | version "1.0.6" 653 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 654 | dependencies: 655 | once "^1.3.0" 656 | wrappy "1" 657 | 658 | inherits@2, inherits@~2.0.1: 659 | version "2.0.3" 660 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 661 | 662 | ini@~1.3.0: 663 | version "1.3.4" 664 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 665 | 666 | invariant@^2.2.0: 667 | version "2.2.1" 668 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.1.tgz#b097010547668c7e337028ebe816ebe36c8a8d54" 669 | dependencies: 670 | loose-envify "^1.0.0" 671 | 672 | invert-kv@^1.0.0: 673 | version "1.0.0" 674 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 675 | 676 | is-arrayish@^0.2.1: 677 | version "0.2.1" 678 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 679 | 680 | is-buffer@^1.0.2: 681 | version "1.1.4" 682 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 683 | 684 | is-builtin-module@^1.0.0: 685 | version "1.0.0" 686 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 687 | dependencies: 688 | builtin-modules "^1.0.0" 689 | 690 | is-dotfile@^1.0.0: 691 | version "1.0.2" 692 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 693 | 694 | is-equal-shallow@^0.1.3: 695 | version "0.1.3" 696 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 697 | dependencies: 698 | is-primitive "^2.0.0" 699 | 700 | is-extendable@^0.1.1: 701 | version "0.1.1" 702 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 703 | 704 | is-extglob@^1.0.0: 705 | version "1.0.0" 706 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 707 | 708 | is-finite@^1.0.0: 709 | version "1.0.2" 710 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 711 | dependencies: 712 | number-is-nan "^1.0.0" 713 | 714 | is-fullwidth-code-point@^1.0.0: 715 | version "1.0.0" 716 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 717 | dependencies: 718 | number-is-nan "^1.0.0" 719 | 720 | is-glob@^2.0.0, is-glob@^2.0.1: 721 | version "2.0.1" 722 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 723 | dependencies: 724 | is-extglob "^1.0.0" 725 | 726 | is-npm@^1.0.0: 727 | version "1.0.0" 728 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 729 | 730 | is-number@^2.0.2, is-number@^2.1.0: 731 | version "2.1.0" 732 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 733 | dependencies: 734 | kind-of "^3.0.2" 735 | 736 | is-obj@^1.0.0: 737 | version "1.0.1" 738 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 739 | 740 | is-posix-bracket@^0.1.0: 741 | version "0.1.1" 742 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 743 | 744 | is-primitive@^2.0.0: 745 | version "2.0.0" 746 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 747 | 748 | is-redirect@^1.0.0: 749 | version "1.0.0" 750 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 751 | 752 | is-retry-allowed@^1.0.0: 753 | version "1.1.0" 754 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 755 | 756 | is-stream@^1.0.0: 757 | version "1.1.0" 758 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 759 | 760 | is-utf8@^0.2.0: 761 | version "0.2.1" 762 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 763 | 764 | isarray@1.0.0, isarray@~1.0.0: 765 | version "1.0.0" 766 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 767 | 768 | isexe@^1.1.1: 769 | version "1.1.2" 770 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 771 | 772 | isobject@^2.0.0: 773 | version "2.1.0" 774 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 775 | dependencies: 776 | isarray "1.0.0" 777 | 778 | istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0: 779 | version "1.0.0" 780 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0.tgz#c3f9b6d226da12424064cce87fce0fb57fdfa7a2" 781 | 782 | istanbul-lib-hook@^1.0.0-alpha.4: 783 | version "1.0.0-alpha.4" 784 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz#8c5bb9f6fbd8526e0ae6cf639af28266906b938f" 785 | dependencies: 786 | append-transform "^0.3.0" 787 | 788 | istanbul-lib-instrument@^1.1.3: 789 | version "1.2.0" 790 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.2.0.tgz#73d5d108ab7568c373fdcb7d01c1d42d565bc8c4" 791 | dependencies: 792 | babel-generator "^6.18.0" 793 | babel-template "^6.16.0" 794 | babel-traverse "^6.18.0" 795 | babel-types "^6.18.0" 796 | babylon "^6.13.0" 797 | istanbul-lib-coverage "^1.0.0" 798 | semver "^5.3.0" 799 | 800 | istanbul-lib-report@^1.0.0-alpha.3: 801 | version "1.0.0-alpha.3" 802 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" 803 | dependencies: 804 | async "^1.4.2" 805 | istanbul-lib-coverage "^1.0.0-alpha" 806 | mkdirp "^0.5.1" 807 | path-parse "^1.0.5" 808 | rimraf "^2.4.3" 809 | supports-color "^3.1.2" 810 | 811 | istanbul-lib-source-maps@^1.0.2: 812 | version "1.0.2" 813 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.0.2.tgz#9e91b0e5ae6ed203f67c69a34e6e98b10bb69a49" 814 | dependencies: 815 | istanbul-lib-coverage "^1.0.0-alpha.0" 816 | mkdirp "^0.5.1" 817 | rimraf "^2.4.4" 818 | source-map "^0.5.3" 819 | 820 | istanbul-reports@^1.0.0-alpha.8: 821 | version "1.0.0" 822 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.0.tgz#24b4eb2b1d29d50f103b369bd422f6e640aa0777" 823 | dependencies: 824 | handlebars "^4.0.3" 825 | 826 | js-tokens@^2.0.0: 827 | version "2.0.0" 828 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" 829 | 830 | jsesc@^1.3.0: 831 | version "1.3.0" 832 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 833 | 834 | json3@3.3.2: 835 | version "3.3.2" 836 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 837 | 838 | kind-of@^3.0.2: 839 | version "3.0.4" 840 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 841 | dependencies: 842 | is-buffer "^1.0.2" 843 | 844 | latest-version@^2.0.0: 845 | version "2.0.0" 846 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" 847 | dependencies: 848 | package-json "^2.0.0" 849 | 850 | lazy-cache@^1.0.3: 851 | version "1.0.4" 852 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 853 | 854 | lazy-req@^1.1.0: 855 | version "1.1.0" 856 | resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" 857 | 858 | lcid@^1.0.0: 859 | version "1.0.0" 860 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 861 | dependencies: 862 | invert-kv "^1.0.0" 863 | 864 | load-json-file@^1.0.0: 865 | version "1.1.0" 866 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 867 | dependencies: 868 | graceful-fs "^4.1.2" 869 | parse-json "^2.2.0" 870 | pify "^2.0.0" 871 | pinkie-promise "^2.0.0" 872 | strip-bom "^2.0.0" 873 | 874 | lodash._baseassign@^3.0.0: 875 | version "3.2.0" 876 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 877 | dependencies: 878 | lodash._basecopy "^3.0.0" 879 | lodash.keys "^3.0.0" 880 | 881 | lodash._basecopy@^3.0.0: 882 | version "3.0.1" 883 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 884 | 885 | lodash._basecreate@^3.0.0: 886 | version "3.0.3" 887 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 888 | 889 | lodash._getnative@^3.0.0: 890 | version "3.9.1" 891 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 892 | 893 | lodash._isiterateecall@^3.0.0: 894 | version "3.0.9" 895 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 896 | 897 | lodash.create@3.1.1: 898 | version "3.1.1" 899 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 900 | dependencies: 901 | lodash._baseassign "^3.0.0" 902 | lodash._basecreate "^3.0.0" 903 | lodash._isiterateecall "^3.0.0" 904 | 905 | lodash.isarguments@^3.0.0: 906 | version "3.1.0" 907 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 908 | 909 | lodash.isarray@^3.0.0: 910 | version "3.0.4" 911 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 912 | 913 | lodash.keys@^3.0.0: 914 | version "3.1.2" 915 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 916 | dependencies: 917 | lodash._getnative "^3.0.0" 918 | lodash.isarguments "^3.0.0" 919 | lodash.isarray "^3.0.0" 920 | 921 | lodash@^4.2.0: 922 | version "4.16.4" 923 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.4.tgz#01ce306b9bad1319f2a5528674f88297aeb70127" 924 | 925 | longest@^1.0.1: 926 | version "1.0.1" 927 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 928 | 929 | loose-envify@^1.0.0: 930 | version "1.3.0" 931 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" 932 | dependencies: 933 | js-tokens "^2.0.0" 934 | 935 | lowercase-keys@^1.0.0: 936 | version "1.0.0" 937 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 938 | 939 | lru-cache@^4.0.1: 940 | version "4.0.1" 941 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.1.tgz#1343955edaf2e37d9b9e7ee7241e27c4b9fb72be" 942 | dependencies: 943 | pseudomap "^1.0.1" 944 | yallist "^2.0.0" 945 | 946 | md5-hex@^1.2.0: 947 | version "1.3.0" 948 | resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" 949 | dependencies: 950 | md5-o-matic "^0.1.1" 951 | 952 | md5-o-matic@^0.1.1: 953 | version "0.1.1" 954 | resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" 955 | 956 | micromatch@^2.3.11: 957 | version "2.3.11" 958 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 959 | dependencies: 960 | arr-diff "^2.0.0" 961 | array-unique "^0.2.1" 962 | braces "^1.8.2" 963 | expand-brackets "^0.1.4" 964 | extglob "^0.3.1" 965 | filename-regex "^2.0.0" 966 | is-extglob "^1.0.0" 967 | is-glob "^2.0.1" 968 | kind-of "^3.0.2" 969 | normalize-path "^2.0.1" 970 | object.omit "^2.0.0" 971 | parse-glob "^3.0.4" 972 | regex-cache "^0.4.2" 973 | 974 | "minimatch@2 || 3", minimatch@^3.0.2: 975 | version "3.0.3" 976 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 977 | dependencies: 978 | brace-expansion "^1.0.0" 979 | 980 | minimist@0.0.8, minimist@~0.0.1: 981 | version "0.0.8" 982 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 983 | 984 | minimist@^0.1.0: 985 | version "0.1.0" 986 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" 987 | 988 | minimist@^1.2.0: 989 | version "1.2.0" 990 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 991 | 992 | mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: 993 | version "0.5.1" 994 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 995 | dependencies: 996 | minimist "0.0.8" 997 | 998 | mocha: 999 | version "3.1.2" 1000 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.1.2.tgz#51f93b432bf7e1b175ffc22883ccd0be32dba6b5" 1001 | dependencies: 1002 | browser-stdout "1.3.0" 1003 | commander "2.9.0" 1004 | debug "2.2.0" 1005 | diff "1.4.0" 1006 | escape-string-regexp "1.0.5" 1007 | glob "7.0.5" 1008 | growl "1.9.2" 1009 | json3 "3.3.2" 1010 | lodash.create "3.1.1" 1011 | mkdirp "0.5.1" 1012 | supports-color "3.1.2" 1013 | 1014 | ms@0.7.1: 1015 | version "0.7.1" 1016 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1017 | 1018 | node-status-codes@^1.0.0: 1019 | version "1.0.0" 1020 | resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" 1021 | 1022 | normalize-package-data@^2.3.2: 1023 | version "2.3.5" 1024 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" 1025 | dependencies: 1026 | hosted-git-info "^2.1.4" 1027 | is-builtin-module "^1.0.0" 1028 | semver "2 || 3 || 4 || 5" 1029 | validate-npm-package-license "^3.0.1" 1030 | 1031 | normalize-path@^2.0.1: 1032 | version "2.0.1" 1033 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 1034 | 1035 | number-is-nan@^1.0.0: 1036 | version "1.0.1" 1037 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1038 | 1039 | nyc: 1040 | version "8.3.2" 1041 | resolved "https://registry.yarnpkg.com/nyc/-/nyc-8.3.2.tgz#a3b7a590fe1c6c4b2d0e3f24afe28b62bfafd745" 1042 | dependencies: 1043 | archy "^1.0.0" 1044 | arrify "^1.0.1" 1045 | caching-transform "^1.0.0" 1046 | convert-source-map "^1.3.0" 1047 | default-require-extensions "^1.0.0" 1048 | find-cache-dir "^0.1.1" 1049 | find-up "^1.1.2" 1050 | foreground-child "^1.5.3" 1051 | glob "^7.0.6" 1052 | istanbul-lib-coverage "^1.0.0" 1053 | istanbul-lib-hook "^1.0.0-alpha.4" 1054 | istanbul-lib-instrument "^1.1.3" 1055 | istanbul-lib-report "^1.0.0-alpha.3" 1056 | istanbul-lib-source-maps "^1.0.2" 1057 | istanbul-reports "^1.0.0-alpha.8" 1058 | md5-hex "^1.2.0" 1059 | micromatch "^2.3.11" 1060 | mkdirp "^0.5.0" 1061 | resolve-from "^2.0.0" 1062 | rimraf "^2.5.4" 1063 | signal-exit "^3.0.1" 1064 | spawn-wrap "^1.2.4" 1065 | test-exclude "^2.1.3" 1066 | yargs "^6.0.0" 1067 | yargs-parser "^4.0.2" 1068 | 1069 | object-assign@^4.0.1, object-assign@^4.1.0: 1070 | version "4.1.0" 1071 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1072 | 1073 | object.omit@^2.0.0: 1074 | version "2.0.1" 1075 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1076 | dependencies: 1077 | for-own "^0.1.4" 1078 | is-extendable "^0.1.1" 1079 | 1080 | once@^1.3.0: 1081 | version "1.4.0" 1082 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1083 | dependencies: 1084 | wrappy "1" 1085 | 1086 | optimist@^0.6.1, optimist@~0.6.0: 1087 | version "0.6.1" 1088 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1089 | dependencies: 1090 | minimist "~0.0.1" 1091 | wordwrap "~0.0.2" 1092 | 1093 | os-homedir@^1.0.0, os-homedir@^1.0.1: 1094 | version "1.0.2" 1095 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1096 | 1097 | os-locale@^1.4.0: 1098 | version "1.4.0" 1099 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1100 | dependencies: 1101 | lcid "^1.0.0" 1102 | 1103 | os-tmpdir@^1.0.0: 1104 | version "1.0.2" 1105 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1106 | 1107 | osenv@^0.1.0: 1108 | version "0.1.4" 1109 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1110 | dependencies: 1111 | os-homedir "^1.0.0" 1112 | os-tmpdir "^1.0.0" 1113 | 1114 | package-json@^2.0.0: 1115 | version "2.4.0" 1116 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" 1117 | dependencies: 1118 | got "^5.0.0" 1119 | registry-auth-token "^3.0.1" 1120 | registry-url "^3.0.3" 1121 | semver "^5.1.0" 1122 | 1123 | parse-glob@^3.0.4: 1124 | version "3.0.4" 1125 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1126 | dependencies: 1127 | glob-base "^0.3.0" 1128 | is-dotfile "^1.0.0" 1129 | is-extglob "^1.0.0" 1130 | is-glob "^2.0.0" 1131 | 1132 | parse-json@^2.1.0, parse-json@^2.2.0: 1133 | version "2.2.0" 1134 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1135 | dependencies: 1136 | error-ex "^1.2.0" 1137 | 1138 | path-exists@^2.0.0: 1139 | version "2.1.0" 1140 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1141 | dependencies: 1142 | pinkie-promise "^2.0.0" 1143 | 1144 | path-is-absolute@^1.0.0: 1145 | version "1.0.1" 1146 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1147 | 1148 | path-parse@^1.0.5: 1149 | version "1.0.5" 1150 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 1151 | 1152 | path-to-regexp@^2.2.0: 1153 | version "2.2.0" 1154 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.0.tgz#80f0ff45c1e0e641da74df313644eaf115050972" 1155 | 1156 | path-type@^1.0.0: 1157 | version "1.1.0" 1158 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1159 | dependencies: 1160 | graceful-fs "^4.1.2" 1161 | pify "^2.0.0" 1162 | pinkie-promise "^2.0.0" 1163 | 1164 | pify@^2.0.0: 1165 | version "2.3.0" 1166 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1167 | 1168 | pinkie-promise@^2.0.0: 1169 | version "2.0.1" 1170 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1171 | dependencies: 1172 | pinkie "^2.0.0" 1173 | 1174 | pinkie@^2.0.0: 1175 | version "2.0.4" 1176 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1177 | 1178 | pkg-dir@^1.0.0: 1179 | version "1.0.0" 1180 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 1181 | dependencies: 1182 | find-up "^1.0.0" 1183 | 1184 | prepend-http@^1.0.1: 1185 | version "1.0.4" 1186 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1187 | 1188 | preserve@^0.2.0: 1189 | version "0.2.0" 1190 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1191 | 1192 | process-nextick-args@~1.0.6: 1193 | version "1.0.7" 1194 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1195 | 1196 | pseudomap@^1.0.1: 1197 | version "1.0.2" 1198 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1199 | 1200 | randomatic@^1.1.3: 1201 | version "1.1.5" 1202 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.5.tgz#5e9ef5f2d573c67bd2b8124ae90b5156e457840b" 1203 | dependencies: 1204 | is-number "^2.0.2" 1205 | kind-of "^3.0.2" 1206 | 1207 | rc@^1.0.1, rc@^1.1.6: 1208 | version "1.1.6" 1209 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 1210 | dependencies: 1211 | deep-extend "~0.4.0" 1212 | ini "~1.3.0" 1213 | minimist "^1.2.0" 1214 | strip-json-comments "~1.0.4" 1215 | 1216 | read-all-stream@^3.0.0: 1217 | version "3.1.0" 1218 | resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" 1219 | dependencies: 1220 | pinkie-promise "^2.0.0" 1221 | readable-stream "^2.0.0" 1222 | 1223 | read-pkg-up@^1.0.1: 1224 | version "1.0.1" 1225 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1226 | dependencies: 1227 | find-up "^1.0.0" 1228 | read-pkg "^1.0.0" 1229 | 1230 | read-pkg@^1.0.0: 1231 | version "1.1.0" 1232 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1233 | dependencies: 1234 | load-json-file "^1.0.0" 1235 | normalize-package-data "^2.3.2" 1236 | path-type "^1.0.0" 1237 | 1238 | readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5: 1239 | version "2.2.2" 1240 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" 1241 | dependencies: 1242 | buffer-shims "^1.0.0" 1243 | core-util-is "~1.0.0" 1244 | inherits "~2.0.1" 1245 | isarray "~1.0.0" 1246 | process-nextick-args "~1.0.6" 1247 | string_decoder "~0.10.x" 1248 | util-deprecate "~1.0.1" 1249 | 1250 | regenerator-runtime@^0.9.5: 1251 | version "0.9.5" 1252 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc" 1253 | 1254 | regex-cache@^0.4.2: 1255 | version "0.4.3" 1256 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1257 | dependencies: 1258 | is-equal-shallow "^0.1.3" 1259 | is-primitive "^2.0.0" 1260 | 1261 | registry-auth-token@^3.0.1: 1262 | version "3.1.0" 1263 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" 1264 | dependencies: 1265 | rc "^1.1.6" 1266 | 1267 | registry-url@^3.0.3: 1268 | version "3.1.0" 1269 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1270 | dependencies: 1271 | rc "^1.0.1" 1272 | 1273 | repeat-element@^1.1.2: 1274 | version "1.1.2" 1275 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1276 | 1277 | repeat-string@^1.5.2: 1278 | version "1.6.1" 1279 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1280 | 1281 | repeating@^2.0.0: 1282 | version "2.0.1" 1283 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1284 | dependencies: 1285 | is-finite "^1.0.0" 1286 | 1287 | require-directory@^2.1.1: 1288 | version "2.1.1" 1289 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1290 | 1291 | require-main-filename@^1.0.1: 1292 | version "1.0.1" 1293 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1294 | 1295 | resolve-from@^2.0.0: 1296 | version "2.0.0" 1297 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 1298 | 1299 | resolve@^1.1.7: 1300 | version "1.2.0" 1301 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" 1302 | 1303 | right-align@^0.1.1: 1304 | version "0.1.3" 1305 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1306 | dependencies: 1307 | align-text "^0.1.1" 1308 | 1309 | rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.4: 1310 | version "2.5.4" 1311 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1312 | dependencies: 1313 | glob "^7.0.5" 1314 | 1315 | semver-diff@^2.0.0: 1316 | version "2.1.0" 1317 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1318 | dependencies: 1319 | semver "^5.0.3" 1320 | 1321 | "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: 1322 | version "5.3.0" 1323 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1324 | 1325 | set-blocking@^2.0.0: 1326 | version "2.0.0" 1327 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1328 | 1329 | signal-exit@^2.0.0: 1330 | version "2.1.2" 1331 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" 1332 | 1333 | signal-exit@^3.0.0, signal-exit@^3.0.1: 1334 | version "3.0.1" 1335 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 1336 | 1337 | slide@^1.1.5: 1338 | version "1.1.6" 1339 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 1340 | 1341 | source-map@^0.4.4: 1342 | version "0.4.4" 1343 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1344 | dependencies: 1345 | amdefine ">=0.0.4" 1346 | 1347 | source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: 1348 | version "0.5.6" 1349 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1350 | 1351 | spawn-wrap@^1.2.4: 1352 | version "1.2.4" 1353 | resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40" 1354 | dependencies: 1355 | foreground-child "^1.3.3" 1356 | mkdirp "^0.5.0" 1357 | os-homedir "^1.0.1" 1358 | rimraf "^2.3.3" 1359 | signal-exit "^2.0.0" 1360 | which "^1.2.4" 1361 | 1362 | spdx-correct@~1.0.0: 1363 | version "1.0.2" 1364 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1365 | dependencies: 1366 | spdx-license-ids "^1.0.2" 1367 | 1368 | spdx-expression-parse@~1.0.0: 1369 | version "1.0.4" 1370 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1371 | 1372 | spdx-license-ids@^1.0.2: 1373 | version "1.2.2" 1374 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1375 | 1376 | sprintf-js@^1.0.3: 1377 | version "1.0.3" 1378 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1379 | 1380 | string-width@^1.0.1, string-width@^1.0.2: 1381 | version "1.0.2" 1382 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1383 | dependencies: 1384 | code-point-at "^1.0.0" 1385 | is-fullwidth-code-point "^1.0.0" 1386 | strip-ansi "^3.0.0" 1387 | 1388 | string_decoder@~0.10.x: 1389 | version "0.10.31" 1390 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1391 | 1392 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1393 | version "3.0.1" 1394 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1395 | dependencies: 1396 | ansi-regex "^2.0.0" 1397 | 1398 | strip-bom@^2.0.0: 1399 | version "2.0.0" 1400 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1401 | dependencies: 1402 | is-utf8 "^0.2.0" 1403 | 1404 | strip-json-comments@~1.0.4: 1405 | version "1.0.4" 1406 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 1407 | 1408 | supports-color@3.1.2, supports-color@^3.1.2: 1409 | version "3.1.2" 1410 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 1411 | dependencies: 1412 | has-flag "^1.0.0" 1413 | 1414 | supports-color@^2.0.0: 1415 | version "2.0.0" 1416 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1417 | 1418 | test-exclude@^2.1.3: 1419 | version "2.1.3" 1420 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-2.1.3.tgz#a8d8968e1da83266f9864f2852c55e220f06434a" 1421 | dependencies: 1422 | arrify "^1.0.1" 1423 | micromatch "^2.3.11" 1424 | object-assign "^4.1.0" 1425 | read-pkg-up "^1.0.1" 1426 | require-main-filename "^1.0.1" 1427 | 1428 | timed-out@^3.0.0: 1429 | version "3.1.1" 1430 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.1.tgz#2eaaa1021888e4ce3b6ce3511fa7a8556114752b" 1431 | 1432 | to-fast-properties@^1.0.1: 1433 | version "1.0.2" 1434 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 1435 | 1436 | tslint@^4.2.0: 1437 | version "4.2.0" 1438 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.2.0.tgz#b9f5c5b871b784ab2f4809e704ade42d62f523ad" 1439 | dependencies: 1440 | babel-code-frame "^6.20.0" 1441 | colors "^1.1.2" 1442 | diff "^3.0.1" 1443 | findup-sync "~0.3.0" 1444 | glob "^7.1.1" 1445 | optimist "~0.6.0" 1446 | resolve "^1.1.7" 1447 | underscore.string "^3.3.4" 1448 | update-notifier "^1.0.2" 1449 | 1450 | type-detect@0.1.1: 1451 | version "0.1.1" 1452 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 1453 | 1454 | type-detect@^1.0.0: 1455 | version "1.0.0" 1456 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 1457 | 1458 | typescript: 1459 | version "2.0.6" 1460 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.0.6.tgz#5385499ac9811508c2c43e0ea07a1ddca435e111" 1461 | 1462 | uglify-js@^2.6: 1463 | version "2.7.4" 1464 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.4.tgz#a295a0de12b6a650c031c40deb0dc40b14568bd2" 1465 | dependencies: 1466 | async "~0.2.6" 1467 | source-map "~0.5.1" 1468 | uglify-to-browserify "~1.0.0" 1469 | yargs "~3.10.0" 1470 | 1471 | uglify-to-browserify@~1.0.0: 1472 | version "1.0.2" 1473 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1474 | 1475 | underscore.string@^3.3.4: 1476 | version "3.3.4" 1477 | resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" 1478 | dependencies: 1479 | sprintf-js "^1.0.3" 1480 | util-deprecate "^1.0.2" 1481 | 1482 | unzip-response@^1.0.2: 1483 | version "1.0.2" 1484 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" 1485 | 1486 | update-notifier@^1.0.2: 1487 | version "1.0.3" 1488 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" 1489 | dependencies: 1490 | boxen "^0.6.0" 1491 | chalk "^1.0.0" 1492 | configstore "^2.0.0" 1493 | is-npm "^1.0.0" 1494 | latest-version "^2.0.0" 1495 | lazy-req "^1.1.0" 1496 | semver-diff "^2.0.0" 1497 | xdg-basedir "^2.0.0" 1498 | 1499 | url-parse-lax@^1.0.0: 1500 | version "1.0.0" 1501 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1502 | dependencies: 1503 | prepend-http "^1.0.1" 1504 | 1505 | util-deprecate@^1.0.2, util-deprecate@~1.0.1: 1506 | version "1.0.2" 1507 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1508 | 1509 | uuid@^2.0.1: 1510 | version "2.0.3" 1511 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 1512 | 1513 | validate-npm-package-license@^3.0.1: 1514 | version "3.0.1" 1515 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1516 | dependencies: 1517 | spdx-correct "~1.0.0" 1518 | spdx-expression-parse "~1.0.0" 1519 | 1520 | which-module@^1.0.0: 1521 | version "1.0.0" 1522 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 1523 | 1524 | which@^1.2.4, which@^1.2.9: 1525 | version "1.2.11" 1526 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.11.tgz#c8b2eeea6b8c1659fa7c1dd4fdaabe9533dc5e8b" 1527 | dependencies: 1528 | isexe "^1.1.1" 1529 | 1530 | widest-line@^1.0.0: 1531 | version "1.0.0" 1532 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 1533 | dependencies: 1534 | string-width "^1.0.1" 1535 | 1536 | window-size@0.1.0: 1537 | version "0.1.0" 1538 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1539 | 1540 | window-size@^0.2.0: 1541 | version "0.2.0" 1542 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" 1543 | 1544 | wordwrap@0.0.2: 1545 | version "0.0.2" 1546 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1547 | 1548 | wordwrap@~0.0.2: 1549 | version "0.0.3" 1550 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 1551 | 1552 | wrap-ansi@^2.0.0: 1553 | version "2.0.0" 1554 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" 1555 | dependencies: 1556 | string-width "^1.0.1" 1557 | 1558 | wrappy@1: 1559 | version "1.0.2" 1560 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1561 | 1562 | write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: 1563 | version "1.2.0" 1564 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab" 1565 | dependencies: 1566 | graceful-fs "^4.1.2" 1567 | imurmurhash "^0.1.4" 1568 | slide "^1.1.5" 1569 | 1570 | xdg-basedir@^2.0.0: 1571 | version "2.0.0" 1572 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" 1573 | dependencies: 1574 | os-homedir "^1.0.0" 1575 | 1576 | y18n@^3.2.1: 1577 | version "3.2.1" 1578 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 1579 | 1580 | yallist@^2.0.0: 1581 | version "2.0.0" 1582 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" 1583 | 1584 | yargs-parser@^4.0.2: 1585 | version "4.0.2" 1586 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.0.2.tgz#7f7173a8c7cca1d81dc7c18692fc07c2c2e2b1e0" 1587 | dependencies: 1588 | camelcase "^3.0.0" 1589 | 1590 | yargs@^6.0.0: 1591 | version "6.3.0" 1592 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.3.0.tgz#19c6dbb768744d571eb6ebae0c174cf2f71b188d" 1593 | dependencies: 1594 | camelcase "^3.0.0" 1595 | cliui "^3.2.0" 1596 | decamelize "^1.1.1" 1597 | get-caller-file "^1.0.1" 1598 | os-locale "^1.4.0" 1599 | read-pkg-up "^1.0.1" 1600 | require-directory "^2.1.1" 1601 | require-main-filename "^1.0.1" 1602 | set-blocking "^2.0.0" 1603 | string-width "^1.0.2" 1604 | which-module "^1.0.0" 1605 | window-size "^0.2.0" 1606 | y18n "^3.2.1" 1607 | yargs-parser "^4.0.2" 1608 | 1609 | yargs@~3.10.0: 1610 | version "3.10.0" 1611 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1612 | dependencies: 1613 | camelcase "^1.0.2" 1614 | cliui "^2.1.0" 1615 | decamelize "^1.0.0" 1616 | window-size "0.1.0" 1617 | --------------------------------------------------------------------------------