├── .babelrc ├── .eslintignore ├── .eslintrc.yaml ├── .gitignore ├── .npmignore ├── README.md ├── lib ├── __tests__ │ ├── index.spec.js │ ├── models │ │ ├── unique-user.js │ │ └── user.js │ └── setup.spec.js └── index.js ├── mocha.opts ├── package.json ├── setup-tests.js ├── src ├── __tests__ │ └── index.spec.js └── index.js └── yarn.lock /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "latest", 4 | "stage-0", 5 | "bluebird" 6 | ], 7 | "plugins": [ 8 | "transform-object-rest-spread" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | lib/* 3 | -------------------------------------------------------------------------------- /.eslintrc.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | extends: airbnb 3 | env: 4 | mocha: true 5 | node: true 6 | parserOptions: 7 | ecmaVersion: 8 8 | sourceType: module 9 | globals: 10 | expect: false 11 | rules: 12 | import/imports-first: 0 13 | import/no-extraneous-dependencies: 14 | - 2 15 | - devDependencies: true 16 | no-underscore-dangle: 0 17 | no-return-assign: 0 18 | no-console: 0 19 | no-mixed-operators: 0 20 | func-names: 0 21 | no-param-reassign: 22 | - 2 23 | - props: false 24 | semi: 25 | - 2 26 | - never 27 | comma-dangle: 28 | - 2 29 | - never 30 | func-style: 31 | - 2 32 | - declaration 33 | - allowArrowFunctions: true 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.un~ 3 | .DS_Store 4 | node_modules/* 5 | src/* 6 | npm-debug* 7 | .yarn-cache.tgz 8 | Session.vim 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.un~ 3 | .DS_Store 4 | node_modules/* 5 | src/* 6 | npm-debug* 7 | .yarn-cache.tgz 8 | Session.vim 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Mongoose Email Address Manager # 2 | 3 | Manage multiple email addresses per user (or other model/doc) with this mongoose schema plugin. 4 | 5 | Something like... 6 | 7 | { 8 | email_addresses: [ 9 | { 10 | email_address: {type: String, unique: unique}, 11 | primary: Date, 12 | verification: { 13 | date: Date, 14 | code: String, 15 | code_expiration: Date 16 | } 17 | } 18 | ] 19 | } 20 | 21 | Install it... 22 | 23 | npm install mongoose-email-address-manager 24 | 25 | Plug it in... (defaults are shown) 26 | 27 | var db = require('mongoose'), 28 | emailAddressManagerPlugin = require('mongoose-email-address-manager'), 29 | UserSchema = db.Schema(), 30 | options = { 31 | _id: true, // removes _id fields from email_address sub docs when set to false 32 | index: true, // sets indexes on emails and verification code 33 | unique: true, // throws a mongo error if emails are not unique 34 | sparse: true, // sparse or not 35 | required: false, // verifies that at least one email sub doc exists 36 | verificationCodePrefix: 'emvc-', // useful for web pages that deal with more than one type of access code / validation code (like mobile numbers) 37 | verificationCodeExpiration: 0, // the amount of hours to add to the expiration date of validation code, defaults to never expire (0) 38 | emailValidationRegex: /^.+@.+$/, // very simple regex validator for email addresses, overwrite if you want something more powerful :) 39 | style: function (key) { // keeping you inline with your style guide, if you require camelCase or Snake_Case or so be it... override your keys with this function, default being under_score 40 | return key 41 | } 42 | }; 43 | 44 | UserSchema.plugin(emailAddressManagerPlugin, options); 45 | 46 | Make the model... 47 | 48 | var User = db.model('user', UserSchema); 49 | 50 | Make the instance or find the instance with the statics below ... 51 | 52 | var user = new User({ 53 | email_addresses: [{ 54 | email_address: 'me@larron.com' 55 | }] 56 | }); 57 | 58 | Use the statics... 59 | 60 | User.findOneByEmail - like mongooses findOne except the first arg is an email_address instead of a condition 61 | User.findByEmail - same here... this is useful if unique is set to false and more than one doc has the same email 62 | User.findByEmailVerificationCode - find the doc by one of it's email verification codes 63 | User.emailExists - use this to check if email exists within entire collection so you can quickly throw that "email already exists" error on your signup forms or something with that cool new API 64 | 65 | Empower your self with easy methods on the instance... 66 | 67 | user.addEmail // add a new email 68 | user.addEmailAndSave 69 | user.getEmail // find the email object within the doc 70 | user.getPrimaryEmail // returns the email object 71 | user.setPrimaryEmail // changes or sets the primary email address (will not save) 72 | user.setPrimaryEmailAndSave // sets the primary email and saves the doc 73 | user.isPrimaryEmail // is it? 74 | user.removeEmail // removes an email address (will not save) 75 | user.removeEmailAndSave 76 | user.emailExists // do we have the email in the doc? It's always a yes or no answer 77 | user.startEmailVerificationProcess // this configures and saves some stuff like a verification code and expiration date for the email (will not save) 78 | user.startEmailVerificationProcessAndSave 79 | user.getEmailByVerificationCode // if you don't have the doc in memory find it first with the static: findByEmailVerificationCode 80 | user.setVerifiedEmail // set an email as verified (will not save) 81 | user.setVerifiedEmailAndSave 82 | user.isVerifiedEmail // returns boolean on rather or not that email address has been verified 83 | 84 | Use the one and only extremely powerful virtual field that hands down that primary email address at all times unless it's undefined 85 | 86 | user.email; // the primary email or equivalent of user.getPrimaryEmail().email_address 87 | 88 | Misc Notes 89 | 90 | On creation/save the first email will become primary pre save if there is not a current primary email address unless there are no email addresses. 91 | On removal of an email address a new primary will be elected 92 | Methods that interact with the DB are Async/Await/Promise compatible (callbacks not currently supported) 93 | 94 | Please refer to the tests for further use. 95 | 96 | Found a bug? Let me know or submit a PR... 97 | 98 | MIT 99 | -------------------------------------------------------------------------------- /lib/__tests__/index.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _bluebird = require('bluebird'); 4 | 5 | var _user = require('./models/user'); 6 | 7 | var _user2 = _interopRequireDefault(_user); 8 | 9 | var _uniqueUser = require('./models/unique-user'); 10 | 11 | var _uniqueUser2 = _interopRequireDefault(_uniqueUser); 12 | 13 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 14 | 15 | describe('Mongoose Email Address Manager', function () { 16 | var user = void 0; 17 | 18 | var primaryEmail = 'me@larronarmstead.com'; 19 | var secondaryEmail = 'larron@larronarmstead.com'; 20 | var newEmail = 'new@email.com'; 21 | var badEmail = 'bad@email.com'; 22 | var verificationCode = 'emvc-code'; 23 | var badVerificationCode = 'emvc-code-bad'; 24 | var expiredVerificationCode = 'emvc-code-expired'; 25 | var verifiedVerificationCode = 'emvc-code-verified'; 26 | var emailWithVerificationCode = 'la@larronarmstead.com'; 27 | var emailWithExpiredVerificationCode = 'ev@larronarmstead.com'; 28 | var emailWithVerification = 'lala@larronarmstead.com'; 29 | 30 | var doc = { 31 | emailAddresses: [{ emailAddress: primaryEmail }, { emailAddress: secondaryEmail }, { 32 | emailAddress: emailWithVerificationCode, 33 | verification: { code: verificationCode } 34 | }, { 35 | emailAddress: emailWithExpiredVerificationCode, 36 | verification: { 37 | code: expiredVerificationCode, 38 | codeExpiration: new Date(2006, 6, 6) 39 | } 40 | }, { 41 | emailAddress: emailWithVerification, 42 | verification: { 43 | code: verifiedVerificationCode, 44 | date: new Date() 45 | } 46 | }] 47 | }; 48 | 49 | before((0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee() { 50 | return regeneratorRuntime.wrap(function _callee$(_context) { 51 | while (1) { 52 | switch (_context.prev = _context.next) { 53 | case 0: 54 | _context.next = 2; 55 | return _user2.default.create(doc); 56 | 57 | case 2: 58 | user = _context.sent; 59 | 60 | case 3: 61 | case 'end': 62 | return _context.stop(); 63 | } 64 | } 65 | }, _callee, undefined); 66 | }))); 67 | 68 | context('using the virtuals', function () { 69 | it('should return the primary email', function () { 70 | return expect(user.email).to.eql(primaryEmail); 71 | }); 72 | }); 73 | 74 | context('_id option', function () { 75 | it('should remove _id fields when set to false', function () { 76 | return expect(user.getEmail(primaryEmail)).not.to.have.property('_id'); 77 | }); 78 | }); 79 | 80 | context('unique option', function () { 81 | before((0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee2() { 82 | return regeneratorRuntime.wrap(function _callee2$(_context2) { 83 | while (1) { 84 | switch (_context2.prev = _context2.next) { 85 | case 0: 86 | _context2.next = 2; 87 | return _uniqueUser2.default.create(doc); 88 | 89 | case 2: 90 | case 'end': 91 | return _context2.stop(); 92 | } 93 | } 94 | }, _callee2, undefined); 95 | }))); 96 | 97 | it('should block duplicate emails', function () { 98 | expect(_uniqueUser2.default.create(doc)).to.be.rejectedWith('dup key'); 99 | }); 100 | }); 101 | 102 | context('required option', function () { 103 | it('should require an email address', function () { 104 | return expect(_user2.default.create({})).to.be.rejectedWith('validation failed'); 105 | }); 106 | }); 107 | 108 | context('style option', function () { 109 | it('should have camelCase styled keys', function () { 110 | return expect(user).to.have.property('emailAddresses'); 111 | }); 112 | }); 113 | 114 | context('using the statics', function () { 115 | it('should find one by email', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee3() { 116 | var result; 117 | return regeneratorRuntime.wrap(function _callee3$(_context3) { 118 | while (1) { 119 | switch (_context3.prev = _context3.next) { 120 | case 0: 121 | _context3.next = 2; 122 | return _user2.default.findOneByEmail(primaryEmail); 123 | 124 | case 2: 125 | result = _context3.sent; 126 | 127 | 128 | expect(result).to.have.property('emailAddresses'); 129 | 130 | case 4: 131 | case 'end': 132 | return _context3.stop(); 133 | } 134 | } 135 | }, _callee3, undefined); 136 | }))); 137 | 138 | it('should find by email', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee4() { 139 | var result; 140 | return regeneratorRuntime.wrap(function _callee4$(_context4) { 141 | while (1) { 142 | switch (_context4.prev = _context4.next) { 143 | case 0: 144 | _context4.next = 2; 145 | return _user2.default.findByEmail(primaryEmail); 146 | 147 | case 2: 148 | result = _context4.sent; 149 | 150 | 151 | expect(result[0]).to.have.property('emailAddresses'); 152 | 153 | case 4: 154 | case 'end': 155 | return _context4.stop(); 156 | } 157 | } 158 | }, _callee4, undefined); 159 | }))); 160 | 161 | it('should find by an email verification code', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee5() { 162 | var result; 163 | return regeneratorRuntime.wrap(function _callee5$(_context5) { 164 | while (1) { 165 | switch (_context5.prev = _context5.next) { 166 | case 0: 167 | _context5.next = 2; 168 | return _user2.default.findByEmailVerificationCode(verificationCode); 169 | 170 | case 2: 171 | result = _context5.sent; 172 | 173 | 174 | expect(result).to.have.property('emailAddresses'); 175 | 176 | case 4: 177 | case 'end': 178 | return _context5.stop(); 179 | } 180 | } 181 | }, _callee5, undefined); 182 | }))); 183 | 184 | it('should confirm that an email exists', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee6() { 185 | var result; 186 | return regeneratorRuntime.wrap(function _callee6$(_context6) { 187 | while (1) { 188 | switch (_context6.prev = _context6.next) { 189 | case 0: 190 | _context6.next = 2; 191 | return _user2.default.emailExists(primaryEmail); 192 | 193 | case 2: 194 | result = _context6.sent; 195 | 196 | 197 | expect(result).to.be.true(); 198 | 199 | case 4: 200 | case 'end': 201 | return _context6.stop(); 202 | } 203 | } 204 | }, _callee6, undefined); 205 | }))); 206 | }); 207 | 208 | context('using the instance methods', function () { 209 | it('should get the primary email address', function () { 210 | var email = user.getPrimaryEmail(); 211 | 212 | expect(email.emailAddress).to.eql(primaryEmail); 213 | }); 214 | 215 | it('should get the email by string', function () { 216 | var email = user.getEmail(primaryEmail); 217 | 218 | expect(email.emailAddress).to.eql(primaryEmail); 219 | }); 220 | 221 | it('should get the email by obejct', function () { 222 | var email = user.getEmail({ emailAddress: primaryEmail }); 223 | 224 | expect(email.emailAddress).to.eql(primaryEmail); 225 | }); 226 | 227 | it('should determine if email exists', function () { 228 | return expect(user.emailExists(primaryEmail)).to.be.true(); 229 | }); 230 | 231 | it('should determine if email does not exist', function () { 232 | return expect(user.emailExists('bad@email.com')).to.be.false(); 233 | }); 234 | 235 | it('should confirm if is primary email by string', function () { 236 | return expect(user.isPrimaryEmail(primaryEmail)).to.be.true(); 237 | }); 238 | 239 | it('should confirm if is primary email by object', function () { 240 | return expect(user.isPrimaryEmail({ 241 | emailAddress: primaryEmail 242 | })).to.be.true(); 243 | }); 244 | 245 | context('modifying methods', function () { 246 | beforeEach((0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee7() { 247 | return regeneratorRuntime.wrap(function _callee7$(_context7) { 248 | while (1) { 249 | switch (_context7.prev = _context7.next) { 250 | case 0: 251 | _context7.next = 2; 252 | return _user2.default.create(doc); 253 | 254 | case 2: 255 | user = _context7.sent; 256 | 257 | case 3: 258 | case 'end': 259 | return _context7.stop(); 260 | } 261 | } 262 | }, _callee7, undefined); 263 | }))); 264 | 265 | it('should add an email by string', function () { 266 | var count = user.emailAddresses.length; 267 | user.addEmail(newEmail); 268 | 269 | expect(user.emailAddresses).to.have.lengthOf(count + 1); 270 | }); 271 | 272 | it('should add an email by object', function () { 273 | var count = user.emailAddresses.length; 274 | user.addEmail({ emailAddress: newEmail }); 275 | 276 | expect(user.emailAddresses).to.have.lengthOf(count + 1); 277 | }); 278 | 279 | it('should add an email by string and save', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee8() { 280 | var count; 281 | return regeneratorRuntime.wrap(function _callee8$(_context8) { 282 | while (1) { 283 | switch (_context8.prev = _context8.next) { 284 | case 0: 285 | count = user.emailAddresses.length; 286 | _context8.next = 3; 287 | return user.addEmailAndSave(newEmail); 288 | 289 | case 3: 290 | 291 | expect(user.emailAddresses).to.have.lengthOf(count + 1); 292 | 293 | case 4: 294 | case 'end': 295 | return _context8.stop(); 296 | } 297 | } 298 | }, _callee8, undefined); 299 | }))); 300 | 301 | it('should add an email by object', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee9() { 302 | var count; 303 | return regeneratorRuntime.wrap(function _callee9$(_context9) { 304 | while (1) { 305 | switch (_context9.prev = _context9.next) { 306 | case 0: 307 | count = user.emailAddresses.length; 308 | _context9.next = 3; 309 | return user.addEmailAndSave({ emailAddress: newEmail }); 310 | 311 | case 3: 312 | 313 | expect(user.emailAddresses).to.have.lengthOf(count + 1); 314 | 315 | case 4: 316 | case 'end': 317 | return _context9.stop(); 318 | } 319 | } 320 | }, _callee9, undefined); 321 | }))); 322 | 323 | it('should set the email as primary by string', function () { 324 | var email = user.setPrimaryEmail(secondaryEmail); 325 | 326 | expect(email.emailAddress).to.eql(secondaryEmail); 327 | expect(user.email).to.eql(secondaryEmail); 328 | }); 329 | 330 | it('should set the email as primary by object', function () { 331 | var email = user.setPrimaryEmail({ emailAddress: secondaryEmail }); 332 | 333 | expect(email.emailAddress).to.eql(secondaryEmail); 334 | expect(user.email).to.eql(secondaryEmail); 335 | }); 336 | 337 | it('should fail when setting a bad primary email', function () { 338 | return expect(function () { 339 | return user.setPrimaryEmail(badEmail); 340 | }).to.throw('does not exist'); 341 | }); 342 | 343 | it('should set the email as primary by string and save', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee10() { 344 | var email; 345 | return regeneratorRuntime.wrap(function _callee10$(_context10) { 346 | while (1) { 347 | switch (_context10.prev = _context10.next) { 348 | case 0: 349 | _context10.next = 2; 350 | return user.setPrimaryEmailAndSave(secondaryEmail); 351 | 352 | case 2: 353 | email = _context10.sent; 354 | 355 | 356 | expect(email.emailAddress).to.eql(secondaryEmail); 357 | expect(user.email).to.eql(secondaryEmail); 358 | 359 | case 5: 360 | case 'end': 361 | return _context10.stop(); 362 | } 363 | } 364 | }, _callee10, undefined); 365 | }))); 366 | 367 | it('should set the email as primary by object and save', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee11() { 368 | var email; 369 | return regeneratorRuntime.wrap(function _callee11$(_context11) { 370 | while (1) { 371 | switch (_context11.prev = _context11.next) { 372 | case 0: 373 | _context11.next = 2; 374 | return user.setPrimaryEmailAndSave({ emailAddress: primaryEmail }); 375 | 376 | case 2: 377 | email = _context11.sent; 378 | 379 | 380 | expect(email).to.exist(); 381 | expect(email.emailAddress).to.eql(primaryEmail); 382 | 383 | case 5: 384 | case 'end': 385 | return _context11.stop(); 386 | } 387 | } 388 | }, _callee11, undefined); 389 | }))); 390 | 391 | it('should fail when setting a bad primary email and saving', function () { 392 | return expect(user.setPrimaryEmailAndSave(badEmail)).to.be.rejectedWith('does not exist'); 393 | }); 394 | 395 | it('should start email verification process', function () { 396 | var email = user.startEmailVerificationProcess(primaryEmail); 397 | 398 | expect(email).to.have.property('verification'); 399 | }); 400 | 401 | it('should fail email verification process with bad email', function () { 402 | return expect(function () { 403 | return user.startEmailVerificationProcess(badEmail); 404 | }).to.throw('does not exist'); 405 | }); 406 | 407 | it('should fail email verification process with already verified email', function () { 408 | return expect(function () { 409 | return user.startEmailVerificationProcess(emailWithVerification); 410 | }).to.throw('already verified'); 411 | }); 412 | 413 | it('should start email verification process and save', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee12() { 414 | var email; 415 | return regeneratorRuntime.wrap(function _callee12$(_context12) { 416 | while (1) { 417 | switch (_context12.prev = _context12.next) { 418 | case 0: 419 | _context12.next = 2; 420 | return user.startEmailVerificationProcessAndSave(primaryEmail); 421 | 422 | case 2: 423 | email = _context12.sent; 424 | 425 | 426 | expect(email).to.have.property('verification'); 427 | 428 | case 4: 429 | case 'end': 430 | return _context12.stop(); 431 | } 432 | } 433 | }, _callee12, undefined); 434 | }))); 435 | 436 | it('should fail email verification process with bad email while saving', function () { 437 | return expect(user.startEmailVerificationProcessAndSave(badEmail)).to.be.rejectedWith('does not exist'); 438 | }); 439 | 440 | it('should fail email verification process with already verified email while saving', function () { 441 | return expect(user.startEmailVerificationProcessAndSave(emailWithVerification)).to.be.rejectedWith('already verified'); 442 | }); 443 | 444 | it('should get email by verification code', function () { 445 | var email = user.getEmailByVerificationCode(verificationCode); 446 | 447 | expect(email.emailAddress).to.eql(emailWithVerificationCode); 448 | }); 449 | 450 | it('should verify an email', function () { 451 | var email = user.setVerifiedEmail(verificationCode); 452 | 453 | expect(email.emailAddress).to.eql(emailWithVerificationCode); 454 | }); 455 | 456 | it('should not verify an email with no existence or code', function () { 457 | return expect(function () { 458 | return user.setVerifiedEmail(badVerificationCode); 459 | }).to.throw('does not exist'); 460 | }); 461 | 462 | it('should not verify an already verified email', function () { 463 | return expect(function () { 464 | return user.setVerifiedEmail(verifiedVerificationCode); 465 | }).to.throw('already verified'); 466 | }); 467 | 468 | it('should not verify an email with an expired code', function () { 469 | return expect(function () { 470 | return user.setVerifiedEmail(expiredVerificationCode); 471 | }).to.throw('code has expired'); 472 | }); 473 | 474 | it('should verify an email and save', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee13() { 475 | var email; 476 | return regeneratorRuntime.wrap(function _callee13$(_context13) { 477 | while (1) { 478 | switch (_context13.prev = _context13.next) { 479 | case 0: 480 | _context13.next = 2; 481 | return user.setVerifiedEmailAndSave(verificationCode); 482 | 483 | case 2: 484 | email = _context13.sent; 485 | 486 | 487 | expect(email.emailAddress).to.eql(emailWithVerificationCode); 488 | 489 | case 4: 490 | case 'end': 491 | return _context13.stop(); 492 | } 493 | } 494 | }, _callee13, undefined); 495 | }))); 496 | 497 | it('should not verify an email with no existence or code while saving', function () { 498 | return expect(user.setVerifiedEmailAndSave(badVerificationCode)).to.be.rejectedWith('does not exist'); 499 | }); 500 | 501 | it('should not verify an already verified email while saving', function () { 502 | return expect(user.setVerifiedEmailAndSave(verifiedVerificationCode)).to.be.rejectedWith('already verified'); 503 | }); 504 | 505 | it('should not verify an email with an expired code while saving', function () { 506 | return expect(user.setVerifiedEmailAndSave(expiredVerificationCode)).to.be.rejectedWith('code has expired'); 507 | }); 508 | 509 | it('should confirm that an email is verified', function () { 510 | return expect(user.isVerifiedEmail(emailWithVerification)).to.be.true(); 511 | }); 512 | 513 | it('should confirm that an email is not verified', function () { 514 | return expect(user.isVerifiedEmail(primaryEmail)).to.be.false(); 515 | }); 516 | }); 517 | 518 | context('destructive methods', function () { 519 | beforeEach((0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee14() { 520 | return regeneratorRuntime.wrap(function _callee14$(_context14) { 521 | while (1) { 522 | switch (_context14.prev = _context14.next) { 523 | case 0: 524 | _context14.next = 2; 525 | return _user2.default.create(doc); 526 | 527 | case 2: 528 | user = _context14.sent; 529 | 530 | case 3: 531 | case 'end': 532 | return _context14.stop(); 533 | } 534 | } 535 | }, _callee14, undefined); 536 | }))); 537 | 538 | it('should remove an email by string', function () { 539 | var count = user.emailAddresses.length; 540 | user.removeEmail(primaryEmail); 541 | 542 | expect(user.emailAddresses).to.have.lengthOf(count - 1); 543 | }); 544 | 545 | it('should remove an email by object', function () { 546 | var count = user.emailAddresses.length; 547 | user.removeEmail({ emailAddress: primaryEmail }); 548 | 549 | expect(user.emailAddresses).to.have.lengthOf(count - 1); 550 | }); 551 | 552 | it('should remove a primary email and select a new primary', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee15() { 553 | return regeneratorRuntime.wrap(function _callee15$(_context15) { 554 | while (1) { 555 | switch (_context15.prev = _context15.next) { 556 | case 0: 557 | _context15.next = 2; 558 | return user.removeEmailAndSave(primaryEmail); 559 | 560 | case 2: 561 | 562 | expect(user.email).not.to.eql(primaryEmail); 563 | 564 | case 3: 565 | case 'end': 566 | return _context15.stop(); 567 | } 568 | } 569 | }, _callee15, undefined); 570 | }))); 571 | 572 | it('should remove an email by string and save', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee16() { 573 | var count; 574 | return regeneratorRuntime.wrap(function _callee16$(_context16) { 575 | while (1) { 576 | switch (_context16.prev = _context16.next) { 577 | case 0: 578 | count = user.emailAddresses.length; 579 | _context16.next = 3; 580 | return user.removeEmailAndSave(primaryEmail); 581 | 582 | case 3: 583 | 584 | expect(user.emailAddresses).to.have.lengthOf(count - 1); 585 | 586 | case 4: 587 | case 'end': 588 | return _context16.stop(); 589 | } 590 | } 591 | }, _callee16, undefined); 592 | }))); 593 | 594 | it('should remove an email by object and save', (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee17() { 595 | var count; 596 | return regeneratorRuntime.wrap(function _callee17$(_context17) { 597 | while (1) { 598 | switch (_context17.prev = _context17.next) { 599 | case 0: 600 | count = user.emailAddresses.length; 601 | _context17.next = 3; 602 | return user.removeEmailAndSave({ emailAddress: primaryEmail }); 603 | 604 | case 3: 605 | 606 | expect(user.emailAddresses).to.have.lengthOf(count - 1); 607 | 608 | case 4: 609 | case 'end': 610 | return _context17.stop(); 611 | } 612 | } 613 | }, _callee17, undefined); 614 | }))); 615 | }); 616 | }); 617 | }); -------------------------------------------------------------------------------- /lib/__tests__/models/unique-user.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _mongoose = require('mongoose'); 8 | 9 | var _mongoose2 = _interopRequireDefault(_mongoose); 10 | 11 | var _lodash = require('lodash'); 12 | 13 | var _index = require('../../index'); 14 | 15 | var _index2 = _interopRequireDefault(_index); 16 | 17 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 18 | 19 | var schema = new _mongoose.Schema(); 20 | 21 | schema.plugin(_index2.default, { 22 | style: function style(key) { 23 | return (0, _lodash.camelCase)(key); 24 | } 25 | }); 26 | 27 | exports.default = _mongoose2.default.model('unique_user', schema); -------------------------------------------------------------------------------- /lib/__tests__/models/user.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _mongoose = require('mongoose'); 8 | 9 | var _mongoose2 = _interopRequireDefault(_mongoose); 10 | 11 | var _lodash = require('lodash'); 12 | 13 | var _index = require('../../index'); 14 | 15 | var _index2 = _interopRequireDefault(_index); 16 | 17 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 18 | 19 | var schema = new _mongoose.Schema(); 20 | 21 | schema.plugin(_index2.default, { 22 | _id: false, 23 | unique: false, 24 | required: true, 25 | style: function style(key) { 26 | return (0, _lodash.camelCase)(key); 27 | } 28 | }); 29 | 30 | exports.default = _mongoose2.default.model('user', schema); -------------------------------------------------------------------------------- /lib/__tests__/setup.spec.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _mongoose = require('mongoose'); 4 | 5 | var _mongoose2 = _interopRequireDefault(_mongoose); 6 | 7 | var _mockgoose = require('mockgoose'); 8 | 9 | var _mockgoose2 = _interopRequireDefault(_mockgoose); 10 | 11 | var _bluebird = require('bluebird'); 12 | 13 | var _bluebird2 = _interopRequireDefault(_bluebird); 14 | 15 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 16 | 17 | _mongoose2.default.Promise = _bluebird2.default; 18 | 19 | before(function (done) { 20 | (0, _mockgoose2.default)(_mongoose2.default).then(function () { 21 | _mongoose2.default.connect('mongodb://localhost/mongoose-email-address-manager', function (err) { 22 | return done(err); 23 | }); 24 | }); 25 | }); 26 | 27 | after(function (done) { 28 | _mongoose2.default.models = {}; 29 | _mongoose2.default.modelSchemas = {}; 30 | _mockgoose2.default.reset(done); 31 | }); 32 | 33 | after(function (done) { 34 | return _mongoose2.default.unmock(done); 35 | }); -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | 7 | var _bluebird = require('bluebird'); 8 | 9 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; 10 | 11 | require('babel-polyfill'); 12 | 13 | var _mongoose = require('mongoose'); 14 | 15 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } 16 | 17 | exports.default = function (schema, options) { 18 | var _s, _ref; 19 | 20 | var config = _extends({ 21 | _id: true, 22 | index: true, 23 | unique: true, 24 | sparse: true, 25 | required: false, 26 | verificationCodePrefix: 'emvc-', 27 | verificationCodeExpiration: 0, 28 | emailValidationRegex: /^.+@.+$/, 29 | style: function style(key) { 30 | return key; 31 | } 32 | }, options); 33 | 34 | var _id = config._id, 35 | index = config.index, 36 | unique = config.unique, 37 | sparse = config.sparse, 38 | required = config.required, 39 | verificationCodePrefix = config.verificationCodePrefix, 40 | verificationCodeExpiration = config.verificationCodeExpiration, 41 | emailValidationRegex = config.emailValidationRegex, 42 | s = config.style; 43 | 44 | 45 | schema.add(_defineProperty({}, s('email_addresses'), [new _mongoose.Schema((_ref = {}, _defineProperty(_ref, s('email_address'), { 46 | type: String, 47 | unique: unique, 48 | sparse: sparse, 49 | required: true 50 | }), _defineProperty(_ref, s('primary'), Date), _defineProperty(_ref, s('verification'), (_s = {}, _defineProperty(_s, s('date'), Date), _defineProperty(_s, s('code'), String), _defineProperty(_s, s('code_expiration'), Date), _s)), _ref), { _id: _id })])); 51 | 52 | var emailAddressKey = s('email_addresses') + '.' + s('email_address'); 53 | var verificationCodeKey = s('email_addresses') + '.' + s('verification') + '.' + s('code'); 54 | var isObject = function isObject(o) { 55 | return Object.prototype.toString.call(o) === '[object Object]'; 56 | }; 57 | var generateEmailVerificationCode = function generateEmailVerificationCode() { 58 | return verificationCodePrefix + function (a, b) { 59 | for (b = a = ''; a++ < 36; b += a * 51 & 52 ? (a ^ 15 ? 8 ^ Math.random() * (a ^ 20 ? 16 : 4) : 4).toString(16) : '-') {}return b; 60 | }(); 61 | }; // eslint-disable-line 62 | var generateEmailVerificationCodeExpiration = function generateEmailVerificationCodeExpiration(hours) { 63 | var d = new Date(); 64 | d.setTime(d.getTime() + hours * 60 * 60 * 1000); 65 | 66 | return d; 67 | }; 68 | var generateEmailVerification = function generateEmailVerification(email, hours) { 69 | email[s('verification')] = _defineProperty({}, s('code'), generateEmailVerificationCode()); 70 | 71 | if (hours > 0) email[s('verification')][s('code_expiration')] = generateEmailVerificationCodeExpiration(hours); 72 | 73 | return email; 74 | }; 75 | 76 | if (index) { 77 | schema.index(_defineProperty({}, emailAddressKey, 1)); 78 | schema.index(_defineProperty({}, verificationCodeKey, 1)); 79 | } 80 | 81 | schema.virtual('email').get(function () { 82 | var email = this.getPrimaryEmail(); 83 | 84 | return email ? email[s('email_address')] : null; 85 | }); 86 | 87 | schema.pre('save', function (next) { 88 | if (!this.email && this[s('email_addresses')].length > 0) { 89 | this[s('email_addresses')][0][s('primary')] = new Date(); 90 | } 91 | 92 | next(); 93 | }); 94 | 95 | schema.statics.findOneByEmail = function (email) { 96 | var query = _defineProperty({}, emailAddressKey, email); 97 | 98 | for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 99 | rest[_key - 1] = arguments[_key]; 100 | } 101 | 102 | return this.findOne.apply(this, [query].concat(rest)); 103 | }; 104 | 105 | schema.statics.findByEmail = function (email) { 106 | var query = _defineProperty({}, emailAddressKey, email); 107 | 108 | for (var _len2 = arguments.length, rest = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { 109 | rest[_key2 - 1] = arguments[_key2]; 110 | } 111 | 112 | return this.find.apply(this, [query].concat(rest)); 113 | }; 114 | 115 | schema.statics.findByEmailVerificationCode = function (code) { 116 | var query = _defineProperty({}, verificationCodeKey, code); 117 | 118 | for (var _len3 = arguments.length, rest = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { 119 | rest[_key3 - 1] = arguments[_key3]; 120 | } 121 | 122 | return this.findOne.apply(this, [query].concat(rest)); 123 | }; 124 | 125 | schema.statics.emailExists = function () { 126 | var _ref2 = (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee(email) { 127 | var doc; 128 | return regeneratorRuntime.wrap(function _callee$(_context) { 129 | while (1) { 130 | switch (_context.prev = _context.next) { 131 | case 0: 132 | _context.next = 2; 133 | return this.findOneByEmail(email); 134 | 135 | case 2: 136 | doc = _context.sent; 137 | return _context.abrupt('return', !!doc); 138 | 139 | case 4: 140 | case 'end': 141 | return _context.stop(); 142 | } 143 | } 144 | }, _callee, this); 145 | })); 146 | 147 | return function (_x) { 148 | return _ref2.apply(this, arguments); 149 | }; 150 | }(); 151 | 152 | schema.methods.addEmail = function (emailToAdd) { 153 | this[s('email_addresses')].push(isObject(emailToAdd) ? emailToAdd : _defineProperty({}, s('email_address'), emailToAdd)); 154 | 155 | return this.getEmail(emailToAdd); 156 | }; 157 | 158 | schema.methods.addEmailAndSave = function () { 159 | var _ref4 = (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee2(emailToAdd) { 160 | var email; 161 | return regeneratorRuntime.wrap(function _callee2$(_context2) { 162 | while (1) { 163 | switch (_context2.prev = _context2.next) { 164 | case 0: 165 | email = this.addEmail(emailToAdd); 166 | _context2.next = 3; 167 | return this.save(); 168 | 169 | case 3: 170 | return _context2.abrupt('return', email); 171 | 172 | case 4: 173 | case 'end': 174 | return _context2.stop(); 175 | } 176 | } 177 | }, _callee2, this); 178 | })); 179 | 180 | return function (_x2) { 181 | return _ref4.apply(this, arguments); 182 | }; 183 | }(); 184 | 185 | schema.methods.getEmail = function (emailToFind) { 186 | return this[s('email_addresses')].find(function (email) { 187 | return email[s('email_address')] === (isObject(emailToFind) ? emailToFind[s('email_address')] : emailToFind); 188 | }); 189 | }; 190 | 191 | schema.methods.emailExists = function (email) { 192 | return !!this.getEmail(email); 193 | }; 194 | 195 | schema.methods.getPrimaryEmail = function () { 196 | return this[s('email_addresses')].find(function (email) { 197 | return email[s('primary')]; 198 | }); 199 | }; 200 | 201 | schema.methods.isPrimaryEmail = function (emailToFind) { 202 | var email = this.getEmail(emailToFind); 203 | 204 | return email ? s('primary') in email : false; 205 | }; 206 | 207 | schema.methods.setPrimaryEmail = function (email) { 208 | var currentPrimaryEmail = this.getPrimaryEmail(); 209 | var newPrimaryEmail = this.getEmail(email); 210 | 211 | if (!newPrimaryEmail) throw new Error('Email does not exist'); 212 | 213 | if (currentPrimaryEmail !== newPrimaryEmail) { 214 | if (currentPrimaryEmail) currentPrimaryEmail[s('primary')] = undefined; 215 | 216 | newPrimaryEmail[s('primary')] = new Date(); 217 | } 218 | 219 | return newPrimaryEmail; 220 | }; 221 | 222 | schema.methods.setPrimaryEmailAndSave = function () { 223 | var _ref5 = (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee3(email) { 224 | var primaryEmail; 225 | return regeneratorRuntime.wrap(function _callee3$(_context3) { 226 | while (1) { 227 | switch (_context3.prev = _context3.next) { 228 | case 0: 229 | primaryEmail = this.setPrimaryEmail(email); 230 | _context3.next = 3; 231 | return this.save(); 232 | 233 | case 3: 234 | return _context3.abrupt('return', primaryEmail); 235 | 236 | case 4: 237 | case 'end': 238 | return _context3.stop(); 239 | } 240 | } 241 | }, _callee3, this); 242 | })); 243 | 244 | return function (_x3) { 245 | return _ref5.apply(this, arguments); 246 | }; 247 | }(); 248 | 249 | schema.methods.removeEmail = function (emailToRemove) { 250 | var email = this.getEmail(emailToRemove); 251 | 252 | if (email) { 253 | this[s('email_addresses')] = this[s('email_addresses')].filter(function (em) { 254 | return em !== email; 255 | }); 256 | 257 | if (this[s('email_addresses')].length && !this.email) { 258 | this.setPrimaryEmail(this[s('email_addresses')][0]); 259 | } 260 | } 261 | 262 | return this[s('email_addresses')]; 263 | }; 264 | 265 | schema.methods.removeEmailAndSave = function () { 266 | var _ref6 = (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee4(emailToRemove) { 267 | return regeneratorRuntime.wrap(function _callee4$(_context4) { 268 | while (1) { 269 | switch (_context4.prev = _context4.next) { 270 | case 0: 271 | this.removeEmail(emailToRemove); 272 | _context4.next = 3; 273 | return this.save(); 274 | 275 | case 3: 276 | return _context4.abrupt('return', this[s('email_addresses')]); 277 | 278 | case 4: 279 | case 'end': 280 | return _context4.stop(); 281 | } 282 | } 283 | }, _callee4, this); 284 | })); 285 | 286 | return function (_x4) { 287 | return _ref6.apply(this, arguments); 288 | }; 289 | }(); 290 | 291 | schema.methods.startEmailVerificationProcess = function (emailToVerify) { 292 | var hours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : verificationCodeExpiration; 293 | 294 | var email = this.getEmail(emailToVerify); 295 | 296 | if (email) { 297 | if (this.isVerifiedEmail(email)) { 298 | throw new Error('Email is already verified'); 299 | } else { 300 | generateEmailVerification(email, hours); 301 | 302 | return email; 303 | } 304 | } else { 305 | throw new Error('Email does not exist'); 306 | } 307 | }; 308 | 309 | schema.methods.startEmailVerificationProcessAndSave = function () { 310 | var _ref7 = (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee5() { 311 | var email, 312 | _args5 = arguments; 313 | return regeneratorRuntime.wrap(function _callee5$(_context5) { 314 | while (1) { 315 | switch (_context5.prev = _context5.next) { 316 | case 0: 317 | email = this.startEmailVerificationProcess.apply(this, _args5); 318 | _context5.next = 3; 319 | return this.save(); 320 | 321 | case 3: 322 | return _context5.abrupt('return', email); 323 | 324 | case 4: 325 | case 'end': 326 | return _context5.stop(); 327 | } 328 | } 329 | }, _callee5, this); 330 | })); 331 | 332 | return function (_x6) { 333 | return _ref7.apply(this, arguments); 334 | }; 335 | }(); 336 | 337 | schema.methods.getEmailByVerificationCode = function (code) { 338 | return this[s('email_addresses')].find(function (email) { 339 | return email[s('verification')] && email[s('verification')][s('code')] === code; 340 | }); 341 | }; 342 | 343 | schema.methods.setVerifiedEmail = function (code) { 344 | var email = this.getEmailByVerificationCode(code); 345 | 346 | if (email) { 347 | if (email[s('verification')]) { 348 | if (this.isVerifiedEmail(email)) { 349 | throw new Error('Email is already verified'); 350 | } else if (email[s('verification')][s('code_expiration')] && email[s('verification')][s('code_expiration')].getTime() <= new Date().getTime()) { 351 | throw new Error('Email validation code has expired'); 352 | } else { 353 | email[s('verification')][s('date')] = new Date(); 354 | } 355 | } 356 | } else { 357 | throw new Error('Email does not exist with that code'); 358 | } 359 | 360 | return email; 361 | }; 362 | 363 | schema.methods.setVerifiedEmailAndSave = function () { 364 | var _ref8 = (0, _bluebird.coroutine)(regeneratorRuntime.mark(function _callee6(code) { 365 | var email; 366 | return regeneratorRuntime.wrap(function _callee6$(_context6) { 367 | while (1) { 368 | switch (_context6.prev = _context6.next) { 369 | case 0: 370 | email = this.setVerifiedEmail(code); 371 | _context6.next = 3; 372 | return this.save(); 373 | 374 | case 3: 375 | return _context6.abrupt('return', email); 376 | 377 | case 4: 378 | case 'end': 379 | return _context6.stop(); 380 | } 381 | } 382 | }, _callee6, this); 383 | })); 384 | 385 | return function (_x7) { 386 | return _ref8.apply(this, arguments); 387 | }; 388 | }(); 389 | 390 | schema.methods.isVerifiedEmail = function (emailToVerify) { 391 | var email = this.getEmail(emailToVerify); 392 | 393 | return !!(email && email[s('verification')] && email[s('verification')][s('date')]); 394 | }; 395 | 396 | schema.path(s('email_addresses')).validate(function (emails) { 397 | return emails.filter(function (email) { 398 | return email[s('primary')]; 399 | }).length <= 1; 400 | }, 'More than one primary email address'); 401 | 402 | schema.path(s('email_addresses')).schema.path(s('email_address')).validate(function (email) { 403 | return emailValidationRegex.test(email); 404 | }, 'Invalid email address'); 405 | 406 | if (required) { 407 | schema.path(s('email_addresses')).validate(function (emails) { 408 | return emails.length; 409 | }, 'Email address required'); 410 | } 411 | }; -------------------------------------------------------------------------------- /mocha.opts: -------------------------------------------------------------------------------- 1 | --compilers js:babel-core/register 2 | --require ./setup-tests.js 3 | --ui bdd 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mongoose-email-address-manager", 3 | "version": "2.0.0", 4 | "description": "Manage multiple email addresses per user (or other model/doc) with this mongoose schema plugin.", 5 | "main": "./lib", 6 | "scripts": { 7 | "start": "npm run test:unit:watch & npm run lint:watch", 8 | "clean": "rm -rf lib && mkdir build", 9 | "build": "npm run clean && ./node_modules/.bin/babel ./src -d ./lib --ignore __tests__", 10 | "lint": "./node_modules/.bin/eslint .", 11 | "lint:fix": "./node_modules/.bin/eslint --fix .", 12 | "lint:watch": "./node_modules/.bin/esw -w .", 13 | "test": "npm run test:unit", 14 | "test:unit": "./node_modules/.bin/mocha --opts ./mocha.opts './*/__tests__/*.spec.js'", 15 | "test:unit:watch": "./node_modules/.bin/mocha -w --opts ./mocha.opts './*/__tests__/*.spec.js'" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git://github.com/larron/mongoose-email-address-manager.git" 20 | }, 21 | "keywords": [ 22 | "address", 23 | "addresses", 24 | "email", 25 | "manager", 26 | "model", 27 | "mongodb", 28 | "mongoose", 29 | "plugin", 30 | "schema" 31 | ], 32 | "author": { 33 | "name": "Larron Armstead", 34 | "email": "me@larronarmstead.com" 35 | }, 36 | "contributors": [ 37 | { 38 | "name": "Casey Capps", 39 | "email": "crcapps@gmail.com" 40 | } 41 | ], 42 | "license": "MIT", 43 | "readmeFilename": "README.md", 44 | "devDependencies": { 45 | "babel": "^6.5.2", 46 | "babel-cli": "^6.18.0", 47 | "babel-polyfill": "^6.16.0", 48 | "babel-preset-bluebird": "^1.0.1", 49 | "babel-preset-latest": "^6.16.0", 50 | "babel-preset-stage-0": "^6.16.0", 51 | "bluebird": "^3.4.6", 52 | "chai": "^3.5.0", 53 | "chai-as-promised": "^6.0.0", 54 | "dirty-chai": "^1.2.2", 55 | "eslint": "^3.11.0", 56 | "eslint-config-airbnb": "^13.0.0", 57 | "eslint-plugin-import": "^2.2.0", 58 | "eslint-plugin-jsx-a11y": "2.2.3", 59 | "eslint-plugin-react": "^6.7.1", 60 | "eslint-watch": "^2.1.14", 61 | "lodash": "^4.17.2", 62 | "mocha": "^3.2.0", 63 | "mockgoose": "^6.0.8", 64 | "mongoose": "^4.7.0" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /setup-tests.js: -------------------------------------------------------------------------------- 1 | import chai, { expect } from 'chai' 2 | import chaiAsPromised from 'chai-as-promised' 3 | import dirtyChai from 'dirty-chai' 4 | 5 | chai.use(chaiAsPromised) 6 | chai.use(dirtyChai) 7 | 8 | global.expect = expect 9 | -------------------------------------------------------------------------------- /src/__tests__/index.spec.js: -------------------------------------------------------------------------------- 1 | import User from './models/user' 2 | import UniqueUser from './models/unique-user' 3 | 4 | describe('Mongoose Email Address Manager', () => { 5 | let user 6 | 7 | const primaryEmail = 'me@larronarmstead.com' 8 | const secondaryEmail = 'larron@larronarmstead.com' 9 | const newEmail = 'new@email.com' 10 | const badEmail = 'bad@email.com' 11 | const verificationCode = 'emvc-code' 12 | const badVerificationCode = 'emvc-code-bad' 13 | const expiredVerificationCode = 'emvc-code-expired' 14 | const verifiedVerificationCode = 'emvc-code-verified' 15 | const emailWithVerificationCode = 'la@larronarmstead.com' 16 | const emailWithExpiredVerificationCode = 'ev@larronarmstead.com' 17 | const emailWithVerification = 'lala@larronarmstead.com' 18 | 19 | const doc = { 20 | emailAddresses: [ 21 | { emailAddress: primaryEmail }, 22 | { emailAddress: secondaryEmail }, 23 | { 24 | emailAddress: emailWithVerificationCode, 25 | verification: { code: verificationCode } 26 | }, 27 | { 28 | emailAddress: emailWithExpiredVerificationCode, 29 | verification: { 30 | code: expiredVerificationCode, 31 | codeExpiration: new Date(2006, 6, 6) 32 | } 33 | }, 34 | { 35 | emailAddress: emailWithVerification, 36 | verification: { 37 | code: verifiedVerificationCode, 38 | date: new Date() 39 | } 40 | } 41 | ] 42 | } 43 | 44 | 45 | before(async () => { 46 | user = await User.create(doc) 47 | }) 48 | 49 | context('using the virtuals', () => { 50 | it('should return the primary email', () => 51 | expect(user.email).to.eql(primaryEmail) 52 | ) 53 | }) 54 | 55 | context('_id option', () => { 56 | it('should remove _id fields when set to false', () => 57 | expect(user.getEmail(primaryEmail)).not.to.have.property('_id') 58 | ) 59 | }) 60 | 61 | context('unique option', () => { 62 | before(async () => { 63 | await UniqueUser.create(doc) 64 | }) 65 | 66 | it('should block duplicate emails', () => { 67 | expect(UniqueUser.create(doc)).to.be.rejectedWith('dup key') 68 | }) 69 | }) 70 | 71 | context('required option', () => { 72 | it('should require an email address', () => 73 | expect(User.create({})).to.be.rejectedWith('validation failed') 74 | ) 75 | }) 76 | 77 | context('style option', () => { 78 | it('should have camelCase styled keys', () => 79 | expect(user).to.have.property('emailAddresses') 80 | ) 81 | }) 82 | 83 | context('using the statics', () => { 84 | it('should find one by email', async () => { 85 | const result = await User.findOneByEmail(primaryEmail) 86 | 87 | expect(result).to.have.property('emailAddresses') 88 | }) 89 | 90 | it('should find by email', async () => { 91 | const result = await User.findByEmail(primaryEmail) 92 | 93 | expect(result[0]).to.have.property('emailAddresses') 94 | }) 95 | 96 | it('should find by an email verification code', async () => { 97 | const result = await User.findByEmailVerificationCode(verificationCode) 98 | 99 | expect(result).to.have.property('emailAddresses') 100 | }) 101 | 102 | it('should confirm that an email exists', async () => { 103 | const result = await User.emailExists(primaryEmail) 104 | 105 | expect(result).to.be.true() 106 | }) 107 | }) 108 | 109 | context('using the instance methods', () => { 110 | it('should get the primary email address', () => { 111 | const email = user.getPrimaryEmail() 112 | 113 | expect(email.emailAddress).to.eql(primaryEmail) 114 | }) 115 | 116 | it('should get the email by string', () => { 117 | const email = user.getEmail(primaryEmail) 118 | 119 | expect(email.emailAddress).to.eql(primaryEmail) 120 | }) 121 | 122 | it('should get the email by obejct', () => { 123 | const email = user.getEmail({ emailAddress: primaryEmail }) 124 | 125 | expect(email.emailAddress).to.eql(primaryEmail) 126 | }) 127 | 128 | it('should determine if email exists', () => 129 | expect(user.emailExists(primaryEmail)).to.be.true() 130 | ) 131 | 132 | it('should determine if email does not exist', () => 133 | expect(user.emailExists('bad@email.com')).to.be.false() 134 | ) 135 | 136 | it('should confirm if is primary email by string', () => 137 | expect(user.isPrimaryEmail(primaryEmail)).to.be.true() 138 | ) 139 | 140 | it('should confirm if is primary email by object', () => 141 | expect(user.isPrimaryEmail({ 142 | emailAddress: primaryEmail 143 | })).to.be.true() 144 | ) 145 | 146 | context('modifying methods', () => { 147 | beforeEach(async () => { 148 | user = await User.create(doc) 149 | }) 150 | 151 | it('should add an email by string', () => { 152 | const count = user.emailAddresses.length 153 | user.addEmail(newEmail) 154 | 155 | expect(user.emailAddresses).to.have.lengthOf(count + 1) 156 | }) 157 | 158 | it('should add an email by object', () => { 159 | const count = user.emailAddresses.length 160 | user.addEmail({ emailAddress: newEmail }) 161 | 162 | expect(user.emailAddresses).to.have.lengthOf(count + 1) 163 | }) 164 | 165 | it('should add an email by string and save', async () => { 166 | const count = user.emailAddresses.length 167 | await user.addEmailAndSave(newEmail) 168 | 169 | expect(user.emailAddresses).to.have.lengthOf(count + 1) 170 | }) 171 | 172 | it('should add an email by object', async () => { 173 | const count = user.emailAddresses.length 174 | await user.addEmailAndSave({ emailAddress: newEmail }) 175 | 176 | expect(user.emailAddresses).to.have.lengthOf(count + 1) 177 | }) 178 | 179 | it('should set the email as primary by string', () => { 180 | const email = user.setPrimaryEmail(secondaryEmail) 181 | 182 | expect(email.emailAddress).to.eql(secondaryEmail) 183 | expect(user.email).to.eql(secondaryEmail) 184 | }) 185 | 186 | it('should set the email as primary by object', () => { 187 | const email = user.setPrimaryEmail({ emailAddress: secondaryEmail }) 188 | 189 | expect(email.emailAddress).to.eql(secondaryEmail) 190 | expect(user.email).to.eql(secondaryEmail) 191 | }) 192 | 193 | it('should fail when setting a bad primary email', () => 194 | expect(() => user.setPrimaryEmail(badEmail)).to.throw('does not exist') 195 | ) 196 | 197 | it('should set the email as primary by string and save', async () => { 198 | const email = await user.setPrimaryEmailAndSave(secondaryEmail) 199 | 200 | expect(email.emailAddress).to.eql(secondaryEmail) 201 | expect(user.email).to.eql(secondaryEmail) 202 | }) 203 | 204 | it('should set the email as primary by object and save', async () => { 205 | const email = await user.setPrimaryEmailAndSave({ emailAddress: primaryEmail }) 206 | 207 | expect(email).to.exist() 208 | expect(email.emailAddress).to.eql(primaryEmail) 209 | }) 210 | 211 | it('should fail when setting a bad primary email and saving', () => 212 | expect(user.setPrimaryEmailAndSave(badEmail)).to.be.rejectedWith('does not exist') 213 | ) 214 | 215 | it('should start email verification process', () => { 216 | const email = user.startEmailVerificationProcess(primaryEmail) 217 | 218 | expect(email).to.have.property('verification') 219 | }) 220 | 221 | it('should fail email verification process with bad email', () => 222 | expect(() => user.startEmailVerificationProcess(badEmail)).to.throw('does not exist') 223 | ) 224 | 225 | it('should fail email verification process with already verified email', () => 226 | expect(() => user.startEmailVerificationProcess(emailWithVerification)).to.throw('already verified') 227 | ) 228 | 229 | it('should start email verification process and save', async () => { 230 | const email = await user.startEmailVerificationProcessAndSave(primaryEmail) 231 | 232 | expect(email).to.have.property('verification') 233 | }) 234 | 235 | it('should fail email verification process with bad email while saving', () => 236 | expect(user.startEmailVerificationProcessAndSave(badEmail)).to.be.rejectedWith('does not exist') 237 | ) 238 | 239 | it('should fail email verification process with already verified email while saving', () => 240 | expect(user.startEmailVerificationProcessAndSave(emailWithVerification)).to.be.rejectedWith('already verified') 241 | ) 242 | 243 | it('should get email by verification code', () => { 244 | const email = user.getEmailByVerificationCode(verificationCode) 245 | 246 | expect(email.emailAddress).to.eql(emailWithVerificationCode) 247 | }) 248 | 249 | it('should verify an email', () => { 250 | const email = user.setVerifiedEmail(verificationCode) 251 | 252 | expect(email.emailAddress).to.eql(emailWithVerificationCode) 253 | }) 254 | 255 | it('should not verify an email with no existence or code', () => 256 | expect(() => user.setVerifiedEmail(badVerificationCode)).to.throw('does not exist') 257 | ) 258 | 259 | it('should not verify an already verified email', () => 260 | expect(() => user.setVerifiedEmail(verifiedVerificationCode)).to.throw('already verified') 261 | ) 262 | 263 | it('should not verify an email with an expired code', () => 264 | expect(() => user.setVerifiedEmail(expiredVerificationCode)).to.throw('code has expired') 265 | ) 266 | 267 | it('should verify an email and save', async () => { 268 | const email = await user.setVerifiedEmailAndSave(verificationCode) 269 | 270 | expect(email.emailAddress).to.eql(emailWithVerificationCode) 271 | }) 272 | 273 | it('should not verify an email with no existence or code while saving', () => 274 | expect(user.setVerifiedEmailAndSave(badVerificationCode)).to.be.rejectedWith('does not exist') 275 | ) 276 | 277 | it('should not verify an already verified email while saving', () => 278 | expect(user.setVerifiedEmailAndSave(verifiedVerificationCode)).to.be.rejectedWith('already verified') 279 | ) 280 | 281 | it('should not verify an email with an expired code while saving', () => 282 | expect(user.setVerifiedEmailAndSave(expiredVerificationCode)).to.be.rejectedWith('code has expired') 283 | ) 284 | 285 | it('should confirm that an email is verified', () => 286 | expect(user.isVerifiedEmail(emailWithVerification)).to.be.true() 287 | ) 288 | 289 | it('should confirm that an email is not verified', () => 290 | expect(user.isVerifiedEmail(primaryEmail)).to.be.false() 291 | ) 292 | }) 293 | 294 | context('destructive methods', () => { 295 | beforeEach(async () => { 296 | user = await User.create(doc) 297 | }) 298 | 299 | it('should remove an email by string', () => { 300 | const count = user.emailAddresses.length 301 | user.removeEmail(primaryEmail) 302 | 303 | expect(user.emailAddresses).to.have.lengthOf(count - 1) 304 | }) 305 | 306 | it('should remove an email by object', () => { 307 | const count = user.emailAddresses.length 308 | user.removeEmail({ emailAddress: primaryEmail }) 309 | 310 | expect(user.emailAddresses).to.have.lengthOf(count - 1) 311 | }) 312 | 313 | it('should remove a primary email and select a new primary', async () => { 314 | await user.removeEmailAndSave(primaryEmail) 315 | 316 | expect(user.email).not.to.eql(primaryEmail) 317 | }) 318 | 319 | it('should remove an email by string and save', async () => { 320 | const count = user.emailAddresses.length 321 | await user.removeEmailAndSave(primaryEmail) 322 | 323 | expect(user.emailAddresses).to.have.lengthOf(count - 1) 324 | }) 325 | 326 | it('should remove an email by object and save', async () => { 327 | const count = user.emailAddresses.length 328 | await user.removeEmailAndSave({ emailAddress: primaryEmail }) 329 | 330 | expect(user.emailAddresses).to.have.lengthOf(count - 1) 331 | }) 332 | }) 333 | }) 334 | }) 335 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import 'babel-polyfill' 2 | import { Schema } from 'mongoose' 3 | 4 | export default (schema, options) => { 5 | const config = { 6 | _id: true, 7 | index: true, 8 | unique: true, 9 | sparse: true, 10 | required: false, 11 | verificationCodePrefix: 'emvc-', 12 | verificationCodeExpiration: 0, 13 | emailValidationRegex: /^.+@.+$/, 14 | style(key) { 15 | return key 16 | }, 17 | ...options 18 | } 19 | 20 | const { 21 | _id, 22 | index, 23 | unique, 24 | sparse, 25 | required, 26 | verificationCodePrefix, 27 | verificationCodeExpiration, 28 | emailValidationRegex, 29 | style: s 30 | } = config 31 | 32 | schema.add({ 33 | [s('email_addresses')]: [ 34 | new Schema({ 35 | [s('email_address')]: { 36 | type: String, 37 | unique, 38 | sparse, 39 | required: true 40 | }, 41 | [s('primary')]: Date, 42 | [s('verification')]: { 43 | [s('date')]: Date, 44 | [s('code')]: String, 45 | [s('code_expiration')]: Date 46 | } 47 | }, { _id }) 48 | ] 49 | }) 50 | 51 | const emailAddressKey = `${s('email_addresses')}.${s('email_address')}` 52 | const verificationCodeKey = `${s('email_addresses')}.${s('verification')}.${s('code')}` 53 | const isObject = o => Object.prototype.toString.call(o) === '[object Object]' 54 | const generateEmailVerificationCode = () => verificationCodePrefix + function(a,b){for(b=a='';a++<36;b+=a*51&52?(a^15?8^Math.random()*(a^20?16:4):4).toString(16):'-');return b}() // eslint-disable-line 55 | const generateEmailVerificationCodeExpiration = (hours) => { 56 | const d = new Date() 57 | d.setTime(d.getTime() + hours * 60 * 60 * 1000) 58 | 59 | return d 60 | } 61 | const generateEmailVerification = (email, hours) => { 62 | email[s('verification')] = { 63 | [s('code')]: generateEmailVerificationCode() 64 | } 65 | 66 | if (hours > 0) email[s('verification')][s('code_expiration')] = generateEmailVerificationCodeExpiration(hours) 67 | 68 | return email 69 | } 70 | 71 | 72 | if (index) { 73 | schema.index({ [emailAddressKey]: 1 }) 74 | schema.index({ [verificationCodeKey]: 1 }) 75 | } 76 | 77 | schema.virtual('email').get(function () { 78 | const email = this.getPrimaryEmail() 79 | 80 | return email 81 | ? email[s('email_address')] 82 | : null 83 | }) 84 | 85 | schema.pre('save', function (next) { 86 | if (!this.email && this[s('email_addresses')].length > 0) { 87 | this[s('email_addresses')][0][s('primary')] = new Date() 88 | } 89 | 90 | next() 91 | }) 92 | 93 | schema.statics.findOneByEmail = function (email, ...rest) { 94 | const query = { [emailAddressKey]: email } 95 | 96 | return this.findOne(query, ...rest) 97 | } 98 | 99 | schema.statics.findByEmail = function (email, ...rest) { 100 | const query = { [emailAddressKey]: email } 101 | 102 | return this.find(query, ...rest) 103 | } 104 | 105 | schema.statics.findByEmailVerificationCode = function (code, ...rest) { 106 | const query = { [verificationCodeKey]: code } 107 | 108 | return this.findOne(query, ...rest) 109 | } 110 | 111 | schema.statics.emailExists = async function (email) { 112 | const doc = await this.findOneByEmail(email) 113 | 114 | return !!doc 115 | } 116 | 117 | schema.methods.addEmail = function (emailToAdd) { 118 | this[s('email_addresses')].push( 119 | isObject(emailToAdd) 120 | ? emailToAdd 121 | : { [s('email_address')]: emailToAdd } 122 | ) 123 | 124 | return this.getEmail(emailToAdd) 125 | } 126 | 127 | schema.methods.addEmailAndSave = async function (emailToAdd) { 128 | const email = this.addEmail(emailToAdd) 129 | await this.save() 130 | 131 | return email 132 | } 133 | 134 | schema.methods.getEmail = function (emailToFind) { 135 | return this[s('email_addresses')].find( 136 | email => email[s('email_address')] === ( 137 | isObject(emailToFind) 138 | ? emailToFind[s('email_address')] 139 | : emailToFind 140 | ) 141 | ) 142 | } 143 | 144 | schema.methods.emailExists = function (email) { 145 | return !!this.getEmail(email) 146 | } 147 | 148 | schema.methods.getPrimaryEmail = function () { 149 | return this[s('email_addresses')].find( 150 | email => email[s('primary')] 151 | ) 152 | } 153 | 154 | schema.methods.isPrimaryEmail = function (emailToFind) { 155 | const email = this.getEmail(emailToFind) 156 | 157 | return email 158 | ? s('primary') in email 159 | : false 160 | } 161 | 162 | schema.methods.setPrimaryEmail = function (email) { 163 | const currentPrimaryEmail = this.getPrimaryEmail() 164 | const newPrimaryEmail = this.getEmail(email) 165 | 166 | if (!newPrimaryEmail) throw new Error('Email does not exist') 167 | 168 | if (currentPrimaryEmail !== newPrimaryEmail) { 169 | if (currentPrimaryEmail) currentPrimaryEmail[s('primary')] = undefined 170 | 171 | newPrimaryEmail[s('primary')] = new Date() 172 | } 173 | 174 | return newPrimaryEmail 175 | } 176 | 177 | schema.methods.setPrimaryEmailAndSave = async function (email) { 178 | const primaryEmail = this.setPrimaryEmail(email) 179 | 180 | await this.save() 181 | return primaryEmail 182 | } 183 | 184 | schema.methods.removeEmail = function (emailToRemove) { 185 | const email = this.getEmail(emailToRemove) 186 | 187 | if (email) { 188 | this[s('email_addresses')] = this[s('email_addresses')].filter( 189 | em => em !== email 190 | ) 191 | 192 | if (this[s('email_addresses')].length && !this.email) { 193 | this.setPrimaryEmail(this[s('email_addresses')][0]) 194 | } 195 | } 196 | 197 | return this[s('email_addresses')] 198 | } 199 | 200 | schema.methods.removeEmailAndSave = async function (emailToRemove) { 201 | this.removeEmail(emailToRemove) 202 | await this.save() 203 | 204 | return this[s('email_addresses')] 205 | } 206 | 207 | schema.methods.startEmailVerificationProcess = function ( 208 | emailToVerify, 209 | hours = verificationCodeExpiration 210 | ) { 211 | const email = this.getEmail(emailToVerify) 212 | 213 | if (email) { 214 | if (this.isVerifiedEmail(email)) { 215 | throw new Error('Email is already verified') 216 | } else { 217 | generateEmailVerification(email, hours) 218 | 219 | return email 220 | } 221 | } else { 222 | throw new Error('Email does not exist') 223 | } 224 | } 225 | 226 | schema.methods.startEmailVerificationProcessAndSave = async function (...rest) { 227 | const email = this.startEmailVerificationProcess(...rest) 228 | await this.save() 229 | 230 | return email 231 | } 232 | 233 | schema.methods.getEmailByVerificationCode = function (code) { 234 | return this[s('email_addresses')].find(email => 235 | email[s('verification')] && email[s('verification')][s('code')] === code 236 | ) 237 | } 238 | 239 | schema.methods.setVerifiedEmail = function (code) { 240 | const email = this.getEmailByVerificationCode(code) 241 | 242 | if (email) { 243 | if (email[s('verification')]) { 244 | if (this.isVerifiedEmail(email)) { 245 | throw new Error('Email is already verified') 246 | } else if ( 247 | email[s('verification')][s('code_expiration')] 248 | && email[s('verification')][s('code_expiration')].getTime() 249 | <= new Date().getTime() 250 | ) { 251 | throw new Error('Email validation code has expired') 252 | } else { 253 | email[s('verification')][s('date')] = new Date() 254 | } 255 | } 256 | } else { 257 | throw new Error('Email does not exist with that code') 258 | } 259 | 260 | return email 261 | } 262 | 263 | schema.methods.setVerifiedEmailAndSave = async function (code) { 264 | const email = this.setVerifiedEmail(code) 265 | await this.save() 266 | 267 | return email 268 | } 269 | 270 | schema.methods.isVerifiedEmail = function (emailToVerify) { 271 | const email = this.getEmail(emailToVerify) 272 | 273 | return !!(email && email[s('verification')] && email[s('verification')][s('date')]) 274 | } 275 | 276 | schema.path(s('email_addresses')).validate(emails => 277 | emails.filter(email => email[s('primary')]).length <= 1 278 | , 'More than one primary email address') 279 | 280 | schema.path(s('email_addresses')).schema.path(s('email_address')).validate( 281 | email => emailValidationRegex.test(email), 282 | 'Invalid email address' 283 | ) 284 | 285 | if (required) { 286 | schema.path(s('email_addresses')).validate( 287 | emails => emails.length, 288 | 'Email address required' 289 | ) 290 | } 291 | } 292 | -------------------------------------------------------------------------------- /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 | acorn-jsx@^3.0.0, acorn-jsx@^3.0.1: 8 | version "3.0.1" 9 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" 10 | dependencies: 11 | acorn "^3.0.4" 12 | 13 | acorn@^3.0.4: 14 | version "3.3.0" 15 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" 16 | 17 | acorn@^4.0.1: 18 | version "4.0.3" 19 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.3.tgz#1a3e850b428e73ba6b09d1cc527f5aaad4d03ef1" 20 | 21 | agent-base@2: 22 | version "2.0.1" 23 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.0.1.tgz#bd8f9e86a8eb221fffa07bd14befd55df142815e" 24 | dependencies: 25 | extend "~3.0.0" 26 | semver "~5.0.1" 27 | 28 | ajv-keywords@^1.0.0: 29 | version "1.1.1" 30 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.1.1.tgz#02550bc605a3e576041565628af972e06c549d50" 31 | 32 | ajv@^4.7.0: 33 | version "4.9.0" 34 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.0.tgz#5a358085747b134eb567d6d15e015f1d7802f45c" 35 | dependencies: 36 | co "^4.6.0" 37 | json-stable-stringify "^1.0.1" 38 | 39 | ansi-escapes@^1.1.0: 40 | version "1.4.0" 41 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 42 | 43 | ansi-regex@^2.0.0: 44 | version "2.0.0" 45 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.0.0.tgz#c5061b6e0ef8a81775e50f5d66151bf6bf371107" 46 | 47 | ansi-styles@^2.2.1: 48 | version "2.2.1" 49 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 50 | 51 | anymatch@^1.3.0: 52 | version "1.3.0" 53 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 54 | dependencies: 55 | arrify "^1.0.0" 56 | micromatch "^2.1.5" 57 | 58 | aproba@^1.0.3: 59 | version "1.0.4" 60 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" 61 | 62 | are-we-there-yet@~1.1.2: 63 | version "1.1.2" 64 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 65 | dependencies: 66 | delegates "^1.0.0" 67 | readable-stream "^2.0.0 || ^1.1.13" 68 | 69 | argparse@^1.0.7: 70 | version "1.0.9" 71 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 72 | dependencies: 73 | sprintf-js "~1.0.2" 74 | 75 | arr-diff@^2.0.0: 76 | version "2.0.0" 77 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 78 | dependencies: 79 | arr-flatten "^1.0.1" 80 | 81 | arr-flatten@^1.0.1: 82 | version "1.0.1" 83 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" 84 | 85 | array-union@^1.0.1: 86 | version "1.0.2" 87 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 88 | dependencies: 89 | array-uniq "^1.0.1" 90 | 91 | array-uniq@^1.0.1: 92 | version "1.0.3" 93 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 94 | 95 | array-unique@^0.2.1: 96 | version "0.2.1" 97 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 98 | 99 | arrify@^1.0.0: 100 | version "1.0.1" 101 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 102 | 103 | asn1@~0.2.3: 104 | version "0.2.3" 105 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 106 | 107 | assert-plus@^0.2.0: 108 | version "0.2.0" 109 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 110 | 111 | assert-plus@^1.0.0: 112 | version "1.0.0" 113 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 114 | 115 | assertion-error@^1.0.1: 116 | version "1.0.2" 117 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 118 | 119 | async-each@^1.0.0: 120 | version "1.0.1" 121 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 122 | 123 | async@^1.5.2: 124 | version "1.5.2" 125 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 126 | 127 | async@2.0.1: 128 | version "2.0.1" 129 | resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" 130 | dependencies: 131 | lodash "^4.8.0" 132 | 133 | async@2.1.2: 134 | version "2.1.2" 135 | resolved "https://registry.yarnpkg.com/async/-/async-2.1.2.tgz#612a4ab45ef42a70cde806bad86ee6db047e8385" 136 | dependencies: 137 | lodash "^4.14.0" 138 | 139 | asynckit@^0.4.0: 140 | version "0.4.0" 141 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 142 | 143 | aws-sign2@~0.6.0: 144 | version "0.6.0" 145 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 146 | 147 | aws4@^1.2.1: 148 | version "1.5.0" 149 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" 150 | 151 | babel: 152 | version "6.5.2" 153 | resolved "https://registry.yarnpkg.com/babel/-/babel-6.5.2.tgz#59140607438270920047ff56f02b2d8630c2d129" 154 | 155 | babel-cli: 156 | version "6.18.0" 157 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.18.0.tgz#92117f341add9dead90f6fa7d0a97c0cc08ec186" 158 | dependencies: 159 | babel-core "^6.18.0" 160 | babel-polyfill "^6.16.0" 161 | babel-register "^6.18.0" 162 | babel-runtime "^6.9.0" 163 | commander "^2.8.1" 164 | convert-source-map "^1.1.0" 165 | fs-readdir-recursive "^1.0.0" 166 | glob "^5.0.5" 167 | lodash "^4.2.0" 168 | output-file-sync "^1.1.0" 169 | path-is-absolute "^1.0.0" 170 | slash "^1.0.0" 171 | source-map "^0.5.0" 172 | v8flags "^2.0.10" 173 | optionalDependencies: 174 | chokidar "^1.0.0" 175 | 176 | babel-code-frame@^6.16.0: 177 | version "6.16.0" 178 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" 179 | dependencies: 180 | chalk "^1.1.0" 181 | esutils "^2.0.2" 182 | js-tokens "^2.0.0" 183 | 184 | babel-core@^6.18.0: 185 | version "6.18.2" 186 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" 187 | dependencies: 188 | babel-code-frame "^6.16.0" 189 | babel-generator "^6.18.0" 190 | babel-helpers "^6.16.0" 191 | babel-messages "^6.8.0" 192 | babel-register "^6.18.0" 193 | babel-runtime "^6.9.1" 194 | babel-template "^6.16.0" 195 | babel-traverse "^6.18.0" 196 | babel-types "^6.18.0" 197 | babylon "^6.11.0" 198 | convert-source-map "^1.1.0" 199 | debug "^2.1.1" 200 | json5 "^0.5.0" 201 | lodash "^4.2.0" 202 | minimatch "^3.0.2" 203 | path-is-absolute "^1.0.0" 204 | private "^0.1.6" 205 | slash "^1.0.0" 206 | source-map "^0.5.0" 207 | 208 | babel-generator@^6.18.0: 209 | version "6.19.0" 210 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" 211 | dependencies: 212 | babel-messages "^6.8.0" 213 | babel-runtime "^6.9.0" 214 | babel-types "^6.19.0" 215 | detect-indent "^4.0.0" 216 | jsesc "^1.3.0" 217 | lodash "^4.2.0" 218 | source-map "^0.5.0" 219 | 220 | babel-helper-bindify-decorators@^6.18.0: 221 | version "6.18.0" 222 | resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.18.0.tgz#fc00c573676a6e702fffa00019580892ec8780a5" 223 | dependencies: 224 | babel-runtime "^6.0.0" 225 | babel-traverse "^6.18.0" 226 | babel-types "^6.18.0" 227 | 228 | babel-helper-builder-binary-assignment-operator-visitor@^6.8.0: 229 | version "6.18.0" 230 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.18.0.tgz#8ae814989f7a53682152e3401a04fabd0bb333a6" 231 | dependencies: 232 | babel-helper-explode-assignable-expression "^6.18.0" 233 | babel-runtime "^6.0.0" 234 | babel-types "^6.18.0" 235 | 236 | babel-helper-call-delegate@^6.18.0: 237 | version "6.18.0" 238 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.18.0.tgz#05b14aafa430884b034097ef29e9f067ea4133bd" 239 | dependencies: 240 | babel-helper-hoist-variables "^6.18.0" 241 | babel-runtime "^6.0.0" 242 | babel-traverse "^6.18.0" 243 | babel-types "^6.18.0" 244 | 245 | babel-helper-define-map@^6.18.0, babel-helper-define-map@^6.8.0: 246 | version "6.18.0" 247 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.18.0.tgz#8d6c85dc7fbb4c19be3de40474d18e97c3676ec2" 248 | dependencies: 249 | babel-helper-function-name "^6.18.0" 250 | babel-runtime "^6.9.0" 251 | babel-types "^6.18.0" 252 | lodash "^4.2.0" 253 | 254 | babel-helper-explode-assignable-expression@^6.18.0: 255 | version "6.18.0" 256 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.18.0.tgz#14b8e8c2d03ad735d4b20f1840b24cd1f65239fe" 257 | dependencies: 258 | babel-runtime "^6.0.0" 259 | babel-traverse "^6.18.0" 260 | babel-types "^6.18.0" 261 | 262 | babel-helper-explode-class@^6.8.0: 263 | version "6.18.0" 264 | resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.18.0.tgz#c44f76f4fa23b9c5d607cbac5d4115e7a76f62cb" 265 | dependencies: 266 | babel-helper-bindify-decorators "^6.18.0" 267 | babel-runtime "^6.0.0" 268 | babel-traverse "^6.18.0" 269 | babel-types "^6.18.0" 270 | 271 | babel-helper-function-name@^6.18.0, babel-helper-function-name@^6.8.0: 272 | version "6.18.0" 273 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.18.0.tgz#68ec71aeba1f3e28b2a6f0730190b754a9bf30e6" 274 | dependencies: 275 | babel-helper-get-function-arity "^6.18.0" 276 | babel-runtime "^6.0.0" 277 | babel-template "^6.8.0" 278 | babel-traverse "^6.18.0" 279 | babel-types "^6.18.0" 280 | 281 | babel-helper-get-function-arity@^6.18.0: 282 | version "6.18.0" 283 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.18.0.tgz#a5b19695fd3f9cdfc328398b47dafcd7094f9f24" 284 | dependencies: 285 | babel-runtime "^6.0.0" 286 | babel-types "^6.18.0" 287 | 288 | babel-helper-hoist-variables@^6.18.0: 289 | version "6.18.0" 290 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.18.0.tgz#a835b5ab8b46d6de9babefae4d98ea41e866b82a" 291 | dependencies: 292 | babel-runtime "^6.0.0" 293 | babel-types "^6.18.0" 294 | 295 | babel-helper-optimise-call-expression@^6.18.0: 296 | version "6.18.0" 297 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.18.0.tgz#9261d0299ee1a4f08a6dd28b7b7c777348fd8f0f" 298 | dependencies: 299 | babel-runtime "^6.0.0" 300 | babel-types "^6.18.0" 301 | 302 | babel-helper-regex@^6.8.0: 303 | version "6.18.0" 304 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.18.0.tgz#ae0ebfd77de86cb2f1af258e2cc20b5fe893ecc6" 305 | dependencies: 306 | babel-runtime "^6.9.0" 307 | babel-types "^6.18.0" 308 | lodash "^4.2.0" 309 | 310 | babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: 311 | version "6.18.0" 312 | resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" 313 | dependencies: 314 | babel-helper-function-name "^6.18.0" 315 | babel-runtime "^6.0.0" 316 | babel-template "^6.16.0" 317 | babel-traverse "^6.18.0" 318 | babel-types "^6.18.0" 319 | 320 | babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: 321 | version "6.18.0" 322 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.18.0.tgz#28ec69877be4144dbd64f4cc3a337e89f29a924e" 323 | dependencies: 324 | babel-helper-optimise-call-expression "^6.18.0" 325 | babel-messages "^6.8.0" 326 | babel-runtime "^6.0.0" 327 | babel-template "^6.16.0" 328 | babel-traverse "^6.18.0" 329 | babel-types "^6.18.0" 330 | 331 | babel-helpers@^6.16.0: 332 | version "6.16.0" 333 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" 334 | dependencies: 335 | babel-runtime "^6.0.0" 336 | babel-template "^6.16.0" 337 | 338 | babel-messages@^6.8.0: 339 | version "6.8.0" 340 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" 341 | dependencies: 342 | babel-runtime "^6.0.0" 343 | 344 | babel-plugin-check-es2015-constants@^6.3.13: 345 | version "6.8.0" 346 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.8.0.tgz#dbf024c32ed37bfda8dee1e76da02386a8d26fe7" 347 | dependencies: 348 | babel-runtime "^6.0.0" 349 | 350 | babel-plugin-syntax-async-functions@^6.8.0: 351 | version "6.13.0" 352 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" 353 | 354 | babel-plugin-syntax-async-generators@^6.5.0: 355 | version "6.13.0" 356 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" 357 | 358 | babel-plugin-syntax-class-constructor-call@^6.18.0: 359 | version "6.18.0" 360 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" 361 | 362 | babel-plugin-syntax-class-properties@^6.8.0: 363 | version "6.13.0" 364 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" 365 | 366 | babel-plugin-syntax-decorators@^6.13.0: 367 | version "6.13.0" 368 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" 369 | 370 | babel-plugin-syntax-do-expressions@^6.8.0: 371 | version "6.13.0" 372 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" 373 | 374 | babel-plugin-syntax-dynamic-import@^6.18.0: 375 | version "6.18.0" 376 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" 377 | 378 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 379 | version "6.13.0" 380 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 381 | 382 | babel-plugin-syntax-export-extensions@^6.8.0: 383 | version "6.13.0" 384 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" 385 | 386 | babel-plugin-syntax-function-bind@^6.8.0: 387 | version "6.13.0" 388 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" 389 | 390 | babel-plugin-syntax-object-rest-spread@^6.8.0: 391 | version "6.13.0" 392 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" 393 | 394 | babel-plugin-syntax-trailing-function-commas@^6.3.13, babel-plugin-syntax-trailing-function-commas@^6.8.0: 395 | version "6.13.0" 396 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" 397 | 398 | babel-plugin-transform-async-generator-functions@^6.17.0: 399 | version "6.17.0" 400 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.17.0.tgz#d0b5a2b2f0940f2b245fa20a00519ed7bc6cae54" 401 | dependencies: 402 | babel-helper-remap-async-to-generator "^6.16.2" 403 | babel-plugin-syntax-async-generators "^6.5.0" 404 | babel-runtime "^6.0.0" 405 | 406 | babel-plugin-transform-async-to-bluebird@^1.0.0: 407 | version "1.0.1" 408 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-bluebird/-/babel-plugin-transform-async-to-bluebird-1.0.1.tgz#fdd012eb69fc0e118190b27da45b1e77a4568906" 409 | dependencies: 410 | babel-helper-function-name "^6.8.0" 411 | babel-plugin-syntax-async-functions "^6.8.0" 412 | babel-template "^6.9.0" 413 | babel-traverse "^6.10.4" 414 | 415 | babel-plugin-transform-async-to-generator@^6.16.0: 416 | version "6.16.0" 417 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.16.0.tgz#19ec36cb1486b59f9f468adfa42ce13908ca2999" 418 | dependencies: 419 | babel-helper-remap-async-to-generator "^6.16.0" 420 | babel-plugin-syntax-async-functions "^6.8.0" 421 | babel-runtime "^6.0.0" 422 | 423 | babel-plugin-transform-class-constructor-call@^6.3.13: 424 | version "6.18.0" 425 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.18.0.tgz#80855e38a1ab47b8c6c647f8ea1bcd2c00ca3aae" 426 | dependencies: 427 | babel-plugin-syntax-class-constructor-call "^6.18.0" 428 | babel-runtime "^6.0.0" 429 | babel-template "^6.8.0" 430 | 431 | babel-plugin-transform-class-properties@^6.18.0: 432 | version "6.19.0" 433 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.19.0.tgz#1274b349abaadc835164e2004f4a2444a2788d5f" 434 | dependencies: 435 | babel-helper-function-name "^6.18.0" 436 | babel-plugin-syntax-class-properties "^6.8.0" 437 | babel-runtime "^6.9.1" 438 | babel-template "^6.15.0" 439 | 440 | babel-plugin-transform-decorators@^6.13.0: 441 | version "6.13.0" 442 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.13.0.tgz#82d65c1470ae83e2d13eebecb0a1c2476d62da9d" 443 | dependencies: 444 | babel-helper-define-map "^6.8.0" 445 | babel-helper-explode-class "^6.8.0" 446 | babel-plugin-syntax-decorators "^6.13.0" 447 | babel-runtime "^6.0.0" 448 | babel-template "^6.8.0" 449 | babel-types "^6.13.0" 450 | 451 | babel-plugin-transform-do-expressions@^6.3.13: 452 | version "6.8.0" 453 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.8.0.tgz#fda692af339835cc255bb7544efb8f7c1306c273" 454 | dependencies: 455 | babel-plugin-syntax-do-expressions "^6.8.0" 456 | babel-runtime "^6.0.0" 457 | 458 | babel-plugin-transform-es2015-arrow-functions@^6.3.13: 459 | version "6.8.0" 460 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.8.0.tgz#5b63afc3181bdc9a8c4d481b5a4f3f7d7fef3d9d" 461 | dependencies: 462 | babel-runtime "^6.0.0" 463 | 464 | babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: 465 | version "6.8.0" 466 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.8.0.tgz#ed95d629c4b5a71ae29682b998f70d9833eb366d" 467 | dependencies: 468 | babel-runtime "^6.0.0" 469 | 470 | babel-plugin-transform-es2015-block-scoping@^6.18.0: 471 | version "6.18.0" 472 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" 473 | dependencies: 474 | babel-runtime "^6.9.0" 475 | babel-template "^6.15.0" 476 | babel-traverse "^6.18.0" 477 | babel-types "^6.18.0" 478 | lodash "^4.2.0" 479 | 480 | babel-plugin-transform-es2015-classes@^6.18.0: 481 | version "6.18.0" 482 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.18.0.tgz#ffe7a17321bf83e494dcda0ae3fc72df48ffd1d9" 483 | dependencies: 484 | babel-helper-define-map "^6.18.0" 485 | babel-helper-function-name "^6.18.0" 486 | babel-helper-optimise-call-expression "^6.18.0" 487 | babel-helper-replace-supers "^6.18.0" 488 | babel-messages "^6.8.0" 489 | babel-runtime "^6.9.0" 490 | babel-template "^6.14.0" 491 | babel-traverse "^6.18.0" 492 | babel-types "^6.18.0" 493 | 494 | babel-plugin-transform-es2015-computed-properties@^6.3.13: 495 | version "6.8.0" 496 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.8.0.tgz#f51010fd61b3bd7b6b60a5fdfd307bb7a5279870" 497 | dependencies: 498 | babel-helper-define-map "^6.8.0" 499 | babel-runtime "^6.0.0" 500 | babel-template "^6.8.0" 501 | 502 | babel-plugin-transform-es2015-destructuring@^6.18.0: 503 | version "6.19.0" 504 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.19.0.tgz#ff1d911c4b3f4cab621bd66702a869acd1900533" 505 | dependencies: 506 | babel-runtime "^6.9.0" 507 | 508 | babel-plugin-transform-es2015-duplicate-keys@^6.6.0: 509 | version "6.8.0" 510 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.8.0.tgz#fd8f7f7171fc108cc1c70c3164b9f15a81c25f7d" 511 | dependencies: 512 | babel-runtime "^6.0.0" 513 | babel-types "^6.8.0" 514 | 515 | babel-plugin-transform-es2015-for-of@^6.18.0: 516 | version "6.18.0" 517 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.18.0.tgz#4c517504db64bf8cfc119a6b8f177211f2028a70" 518 | dependencies: 519 | babel-runtime "^6.0.0" 520 | 521 | babel-plugin-transform-es2015-function-name@^6.9.0: 522 | version "6.9.0" 523 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.9.0.tgz#8c135b17dbd064e5bba56ec511baaee2fca82719" 524 | dependencies: 525 | babel-helper-function-name "^6.8.0" 526 | babel-runtime "^6.9.0" 527 | babel-types "^6.9.0" 528 | 529 | babel-plugin-transform-es2015-literals@^6.3.13: 530 | version "6.8.0" 531 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.8.0.tgz#50aa2e5c7958fc2ab25d74ec117e0cc98f046468" 532 | dependencies: 533 | babel-runtime "^6.0.0" 534 | 535 | babel-plugin-transform-es2015-modules-amd@^6.18.0: 536 | version "6.18.0" 537 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.18.0.tgz#49a054cbb762bdf9ae2d8a807076cfade6141e40" 538 | dependencies: 539 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 540 | babel-runtime "^6.0.0" 541 | babel-template "^6.8.0" 542 | 543 | babel-plugin-transform-es2015-modules-commonjs@^6.18.0: 544 | version "6.18.0" 545 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.18.0.tgz#c15ae5bb11b32a0abdcc98a5837baa4ee8d67bcc" 546 | dependencies: 547 | babel-plugin-transform-strict-mode "^6.18.0" 548 | babel-runtime "^6.0.0" 549 | babel-template "^6.16.0" 550 | babel-types "^6.18.0" 551 | 552 | babel-plugin-transform-es2015-modules-systemjs@^6.18.0: 553 | version "6.19.0" 554 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.19.0.tgz#50438136eba74527efa00a5b0fefaf1dc4071da6" 555 | dependencies: 556 | babel-helper-hoist-variables "^6.18.0" 557 | babel-runtime "^6.11.6" 558 | babel-template "^6.14.0" 559 | 560 | babel-plugin-transform-es2015-modules-umd@^6.18.0: 561 | version "6.18.0" 562 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.18.0.tgz#23351770ece5c1f8e83ed67cb1d7992884491e50" 563 | dependencies: 564 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 565 | babel-runtime "^6.0.0" 566 | babel-template "^6.8.0" 567 | 568 | babel-plugin-transform-es2015-object-super@^6.3.13: 569 | version "6.8.0" 570 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.8.0.tgz#1b858740a5a4400887c23dcff6f4d56eea4a24c5" 571 | dependencies: 572 | babel-helper-replace-supers "^6.8.0" 573 | babel-runtime "^6.0.0" 574 | 575 | babel-plugin-transform-es2015-parameters@^6.18.0: 576 | version "6.18.0" 577 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.18.0.tgz#9b2cfe238c549f1635ba27fc1daa858be70608b1" 578 | dependencies: 579 | babel-helper-call-delegate "^6.18.0" 580 | babel-helper-get-function-arity "^6.18.0" 581 | babel-runtime "^6.9.0" 582 | babel-template "^6.16.0" 583 | babel-traverse "^6.18.0" 584 | babel-types "^6.18.0" 585 | 586 | babel-plugin-transform-es2015-shorthand-properties@^6.18.0: 587 | version "6.18.0" 588 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.18.0.tgz#e2ede3b7df47bf980151926534d1dd0cbea58f43" 589 | dependencies: 590 | babel-runtime "^6.0.0" 591 | babel-types "^6.18.0" 592 | 593 | babel-plugin-transform-es2015-spread@^6.3.13: 594 | version "6.8.0" 595 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.8.0.tgz#0217f737e3b821fa5a669f187c6ed59205f05e9c" 596 | dependencies: 597 | babel-runtime "^6.0.0" 598 | 599 | babel-plugin-transform-es2015-sticky-regex@^6.3.13: 600 | version "6.8.0" 601 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.8.0.tgz#e73d300a440a35d5c64f5c2a344dc236e3df47be" 602 | dependencies: 603 | babel-helper-regex "^6.8.0" 604 | babel-runtime "^6.0.0" 605 | babel-types "^6.8.0" 606 | 607 | babel-plugin-transform-es2015-template-literals@^6.6.0: 608 | version "6.8.0" 609 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.8.0.tgz#86eb876d0a2c635da4ec048b4f7de9dfc897e66b" 610 | dependencies: 611 | babel-runtime "^6.0.0" 612 | 613 | babel-plugin-transform-es2015-typeof-symbol@^6.18.0: 614 | version "6.18.0" 615 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.18.0.tgz#0b14c48629c90ff47a0650077f6aa699bee35798" 616 | dependencies: 617 | babel-runtime "^6.0.0" 618 | 619 | babel-plugin-transform-es2015-unicode-regex@^6.3.13: 620 | version "6.11.0" 621 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.11.0.tgz#6298ceabaad88d50a3f4f392d8de997260f6ef2c" 622 | dependencies: 623 | babel-helper-regex "^6.8.0" 624 | babel-runtime "^6.0.0" 625 | regexpu-core "^2.0.0" 626 | 627 | babel-plugin-transform-exponentiation-operator@^6.3.13: 628 | version "6.8.0" 629 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.8.0.tgz#db25742e9339eade676ca9acec46f955599a68a4" 630 | dependencies: 631 | babel-helper-builder-binary-assignment-operator-visitor "^6.8.0" 632 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 633 | babel-runtime "^6.0.0" 634 | 635 | babel-plugin-transform-export-extensions@^6.3.13: 636 | version "6.8.0" 637 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.8.0.tgz#fa80ff655b636549431bfd38f6b817bd82e47f5b" 638 | dependencies: 639 | babel-plugin-syntax-export-extensions "^6.8.0" 640 | babel-runtime "^6.0.0" 641 | 642 | babel-plugin-transform-function-bind@^6.3.13: 643 | version "6.8.0" 644 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.8.0.tgz#e7f334ce69f50d28fe850a822eaaab9fa4f4d821" 645 | dependencies: 646 | babel-plugin-syntax-function-bind "^6.8.0" 647 | babel-runtime "^6.0.0" 648 | 649 | babel-plugin-transform-object-rest-spread@^6.16.0: 650 | version "6.19.0" 651 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz#f6ac428ee3cb4c6aa00943ed1422ce813603b34c" 652 | dependencies: 653 | babel-plugin-syntax-object-rest-spread "^6.8.0" 654 | babel-runtime "^6.0.0" 655 | 656 | babel-plugin-transform-promise-to-bluebird@^1.1.0: 657 | version "1.1.1" 658 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-promise-to-bluebird/-/babel-plugin-transform-promise-to-bluebird-1.1.1.tgz#dbb0882086ba3da6e1dfc2eeb58d1293acfee8f6" 659 | 660 | babel-plugin-transform-regenerator@^6.16.0: 661 | version "6.16.1" 662 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" 663 | dependencies: 664 | babel-runtime "^6.9.0" 665 | babel-types "^6.16.0" 666 | private "~0.1.5" 667 | 668 | babel-plugin-transform-strict-mode@^6.18.0: 669 | version "6.18.0" 670 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.18.0.tgz#df7cf2991fe046f44163dcd110d5ca43bc652b9d" 671 | dependencies: 672 | babel-runtime "^6.0.0" 673 | babel-types "^6.18.0" 674 | 675 | babel-polyfill, babel-polyfill@^6.16.0: 676 | version "6.16.0" 677 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" 678 | dependencies: 679 | babel-runtime "^6.9.1" 680 | core-js "^2.4.0" 681 | regenerator-runtime "^0.9.5" 682 | 683 | babel-preset-bluebird: 684 | version "1.0.1" 685 | resolved "https://registry.yarnpkg.com/babel-preset-bluebird/-/babel-preset-bluebird-1.0.1.tgz#353b92436ef0ba38136dc3292f419748b0516356" 686 | dependencies: 687 | babel-plugin-transform-async-to-bluebird "^1.0.0" 688 | babel-plugin-transform-promise-to-bluebird "^1.1.0" 689 | 690 | babel-preset-es2015@^6.16.0: 691 | version "6.18.0" 692 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.18.0.tgz#b8c70df84ec948c43dcf2bf770e988eb7da88312" 693 | dependencies: 694 | babel-plugin-check-es2015-constants "^6.3.13" 695 | babel-plugin-transform-es2015-arrow-functions "^6.3.13" 696 | babel-plugin-transform-es2015-block-scoped-functions "^6.3.13" 697 | babel-plugin-transform-es2015-block-scoping "^6.18.0" 698 | babel-plugin-transform-es2015-classes "^6.18.0" 699 | babel-plugin-transform-es2015-computed-properties "^6.3.13" 700 | babel-plugin-transform-es2015-destructuring "^6.18.0" 701 | babel-plugin-transform-es2015-duplicate-keys "^6.6.0" 702 | babel-plugin-transform-es2015-for-of "^6.18.0" 703 | babel-plugin-transform-es2015-function-name "^6.9.0" 704 | babel-plugin-transform-es2015-literals "^6.3.13" 705 | babel-plugin-transform-es2015-modules-amd "^6.18.0" 706 | babel-plugin-transform-es2015-modules-commonjs "^6.18.0" 707 | babel-plugin-transform-es2015-modules-systemjs "^6.18.0" 708 | babel-plugin-transform-es2015-modules-umd "^6.18.0" 709 | babel-plugin-transform-es2015-object-super "^6.3.13" 710 | babel-plugin-transform-es2015-parameters "^6.18.0" 711 | babel-plugin-transform-es2015-shorthand-properties "^6.18.0" 712 | babel-plugin-transform-es2015-spread "^6.3.13" 713 | babel-plugin-transform-es2015-sticky-regex "^6.3.13" 714 | babel-plugin-transform-es2015-template-literals "^6.6.0" 715 | babel-plugin-transform-es2015-typeof-symbol "^6.18.0" 716 | babel-plugin-transform-es2015-unicode-regex "^6.3.13" 717 | babel-plugin-transform-regenerator "^6.16.0" 718 | 719 | babel-preset-es2016@^6.16.0: 720 | version "6.16.0" 721 | resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.16.0.tgz#c7daf5feedeee99c867813bdf0d573d94ca12812" 722 | dependencies: 723 | babel-plugin-transform-exponentiation-operator "^6.3.13" 724 | 725 | babel-preset-es2017@^6.16.0: 726 | version "6.16.0" 727 | resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.16.0.tgz#536c6287778a758948ddd092b466b6ef50b786fa" 728 | dependencies: 729 | babel-plugin-syntax-trailing-function-commas "^6.8.0" 730 | babel-plugin-transform-async-to-generator "^6.16.0" 731 | 732 | babel-preset-latest: 733 | version "6.16.0" 734 | resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.16.0.tgz#5b87e19e250bb1213f13af4ec9dc7a51d53f388d" 735 | dependencies: 736 | babel-preset-es2015 "^6.16.0" 737 | babel-preset-es2016 "^6.16.0" 738 | babel-preset-es2017 "^6.16.0" 739 | 740 | babel-preset-stage-0: 741 | version "6.16.0" 742 | resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.16.0.tgz#f5a263c420532fd57491f1a7315b3036e428f823" 743 | dependencies: 744 | babel-plugin-transform-do-expressions "^6.3.13" 745 | babel-plugin-transform-function-bind "^6.3.13" 746 | babel-preset-stage-1 "^6.16.0" 747 | 748 | babel-preset-stage-1@^6.16.0: 749 | version "6.16.0" 750 | resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.16.0.tgz#9d31fbbdae7b17c549fd3ac93e3cf6902695e479" 751 | dependencies: 752 | babel-plugin-transform-class-constructor-call "^6.3.13" 753 | babel-plugin-transform-export-extensions "^6.3.13" 754 | babel-preset-stage-2 "^6.16.0" 755 | 756 | babel-preset-stage-2@^6.16.0: 757 | version "6.18.0" 758 | resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.18.0.tgz#9eb7bf9a8e91c68260d5ba7500493caaada4b5b5" 759 | dependencies: 760 | babel-plugin-syntax-dynamic-import "^6.18.0" 761 | babel-plugin-transform-class-properties "^6.18.0" 762 | babel-plugin-transform-decorators "^6.13.0" 763 | babel-preset-stage-3 "^6.17.0" 764 | 765 | babel-preset-stage-3@^6.17.0: 766 | version "6.17.0" 767 | resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.17.0.tgz#b6638e46db6e91e3f889013d8ce143917c685e39" 768 | dependencies: 769 | babel-plugin-syntax-trailing-function-commas "^6.3.13" 770 | babel-plugin-transform-async-generator-functions "^6.17.0" 771 | babel-plugin-transform-async-to-generator "^6.16.0" 772 | babel-plugin-transform-exponentiation-operator "^6.3.13" 773 | babel-plugin-transform-object-rest-spread "^6.16.0" 774 | 775 | babel-register@^6.18.0: 776 | version "6.18.0" 777 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" 778 | dependencies: 779 | babel-core "^6.18.0" 780 | babel-runtime "^6.11.6" 781 | core-js "^2.4.0" 782 | home-or-tmp "^2.0.0" 783 | lodash "^4.2.0" 784 | mkdirp "^0.5.1" 785 | source-map-support "^0.4.2" 786 | 787 | babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: 788 | version "6.18.0" 789 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" 790 | dependencies: 791 | core-js "^2.4.0" 792 | regenerator-runtime "^0.9.5" 793 | 794 | babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0, babel-template@^6.9.0: 795 | version "6.16.0" 796 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" 797 | dependencies: 798 | babel-runtime "^6.9.0" 799 | babel-traverse "^6.16.0" 800 | babel-types "^6.16.0" 801 | babylon "^6.11.0" 802 | lodash "^4.2.0" 803 | 804 | babel-traverse@^6.10.4, babel-traverse@^6.16.0, babel-traverse@^6.18.0: 805 | version "6.19.0" 806 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" 807 | dependencies: 808 | babel-code-frame "^6.16.0" 809 | babel-messages "^6.8.0" 810 | babel-runtime "^6.9.0" 811 | babel-types "^6.19.0" 812 | babylon "^6.11.0" 813 | debug "^2.2.0" 814 | globals "^9.0.0" 815 | invariant "^2.2.0" 816 | lodash "^4.2.0" 817 | 818 | babel-types@^6.13.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.8.0, babel-types@^6.9.0: 819 | version "6.19.0" 820 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" 821 | dependencies: 822 | babel-runtime "^6.9.1" 823 | esutils "^2.0.2" 824 | lodash "^4.2.0" 825 | to-fast-properties "^1.0.1" 826 | 827 | babylon@^6.11.0: 828 | version "6.14.1" 829 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" 830 | 831 | balanced-match@^0.4.1: 832 | version "0.4.2" 833 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 834 | 835 | bcrypt-pbkdf@^1.0.0: 836 | version "1.0.0" 837 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.0.tgz#3ca76b85241c7170bf7d9703e7b9aa74630040d4" 838 | dependencies: 839 | tweetnacl "^0.14.3" 840 | 841 | binary-extensions@^1.0.0: 842 | version "1.7.0" 843 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" 844 | 845 | bl@^1.0.0: 846 | version "1.1.2" 847 | resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" 848 | dependencies: 849 | readable-stream "~2.0.5" 850 | 851 | block-stream@*: 852 | version "0.0.9" 853 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 854 | dependencies: 855 | inherits "~2.0.0" 856 | 857 | bluebird: 858 | version "3.4.6" 859 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" 860 | 861 | bluebird@2.10.2: 862 | version "2.10.2" 863 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.10.2.tgz#024a5517295308857f14f91f1106fc3b555f446b" 864 | 865 | boom@2.x.x: 866 | version "2.10.1" 867 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 868 | dependencies: 869 | hoek "2.x.x" 870 | 871 | brace-expansion@^1.0.0: 872 | version "1.1.6" 873 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 874 | dependencies: 875 | balanced-match "^0.4.1" 876 | concat-map "0.0.1" 877 | 878 | braces@^1.8.2: 879 | version "1.8.5" 880 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 881 | dependencies: 882 | expand-range "^1.8.1" 883 | preserve "^0.2.0" 884 | repeat-element "^1.1.2" 885 | 886 | browser-stdout@1.3.0: 887 | version "1.3.0" 888 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" 889 | 890 | bson@~0.5.4, bson@~0.5.6: 891 | version "0.5.7" 892 | resolved "https://registry.yarnpkg.com/bson/-/bson-0.5.7.tgz#0d11fe0936c1fee029e11f7063f5d0ab2422ea3e" 893 | 894 | buffer-crc32@~0.2.3: 895 | version "0.2.13" 896 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 897 | 898 | buffer-shims@^1.0.0: 899 | version "1.0.0" 900 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 901 | 902 | buffer-to-vinyl@^1.0.0: 903 | version "1.1.0" 904 | resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" 905 | dependencies: 906 | file-type "^3.1.0" 907 | readable-stream "^2.0.2" 908 | uuid "^2.0.1" 909 | vinyl "^1.0.0" 910 | 911 | builtin-modules@^1.1.1: 912 | version "1.1.1" 913 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 914 | 915 | caller-path@^0.1.0: 916 | version "0.1.0" 917 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 918 | dependencies: 919 | callsites "^0.2.0" 920 | 921 | callsites@^0.2.0: 922 | version "0.2.0" 923 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 924 | 925 | camelcase@^2.0.1: 926 | version "2.1.1" 927 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 928 | 929 | caseless@~0.11.0: 930 | version "0.11.0" 931 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 932 | 933 | chai: 934 | version "3.5.0" 935 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 936 | dependencies: 937 | assertion-error "^1.0.1" 938 | deep-eql "^0.1.3" 939 | type-detect "^1.0.0" 940 | 941 | chai-as-promised: 942 | version "6.0.0" 943 | resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-6.0.0.tgz#1a02a433a6f24dafac63b9c96fa1684db1aa8da6" 944 | dependencies: 945 | check-error "^1.0.2" 946 | 947 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: 948 | version "1.1.3" 949 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 950 | dependencies: 951 | ansi-styles "^2.2.1" 952 | escape-string-regexp "^1.0.2" 953 | has-ansi "^2.0.0" 954 | strip-ansi "^3.0.0" 955 | supports-color "^2.0.0" 956 | 957 | check-error@^1.0.2: 958 | version "1.0.2" 959 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 960 | 961 | chokidar@^1.0.0, chokidar@^1.4.3: 962 | version "1.6.1" 963 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 964 | dependencies: 965 | anymatch "^1.3.0" 966 | async-each "^1.0.0" 967 | glob-parent "^2.0.0" 968 | inherits "^2.0.1" 969 | is-binary-path "^1.0.0" 970 | is-glob "^2.0.0" 971 | path-is-absolute "^1.0.0" 972 | readdirp "^2.0.0" 973 | optionalDependencies: 974 | fsevents "^1.0.0" 975 | 976 | circular-json@^0.3.0: 977 | version "0.3.1" 978 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" 979 | 980 | cli-cursor@^1.0.1: 981 | version "1.0.2" 982 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 983 | dependencies: 984 | restore-cursor "^1.0.1" 985 | 986 | cli-width@^2.0.0: 987 | version "2.1.0" 988 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 989 | 990 | cliui@^3.0.3: 991 | version "3.2.0" 992 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 993 | dependencies: 994 | string-width "^1.0.1" 995 | strip-ansi "^3.0.1" 996 | wrap-ansi "^2.0.0" 997 | 998 | clone-stats@^0.0.1: 999 | version "0.0.1" 1000 | resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" 1001 | 1002 | clone@^0.2.0: 1003 | version "0.2.0" 1004 | resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" 1005 | 1006 | clone@^1.0.0: 1007 | version "1.0.2" 1008 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 1009 | 1010 | co@^4.6.0: 1011 | version "4.6.0" 1012 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 1013 | 1014 | code-point-at@^1.0.0: 1015 | version "1.1.0" 1016 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 1017 | 1018 | combined-stream@^1.0.5, combined-stream@~1.0.5: 1019 | version "1.0.5" 1020 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 1021 | dependencies: 1022 | delayed-stream "~1.0.0" 1023 | 1024 | commander@^2.8.1, commander@^2.9.0, commander@2.9.0: 1025 | version "2.9.0" 1026 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 1027 | dependencies: 1028 | graceful-readlink ">= 1.0.0" 1029 | 1030 | commander@~2.8.1: 1031 | version "2.8.1" 1032 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" 1033 | dependencies: 1034 | graceful-readlink ">= 1.0.0" 1035 | 1036 | concat-map@0.0.1: 1037 | version "0.0.1" 1038 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1039 | 1040 | concat-stream@^1.4.6, concat-stream@^1.4.7: 1041 | version "1.5.2" 1042 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" 1043 | dependencies: 1044 | inherits "~2.0.1" 1045 | readable-stream "~2.0.0" 1046 | typedarray "~0.0.5" 1047 | 1048 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 1049 | version "1.1.0" 1050 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 1051 | 1052 | contains-path@^0.1.0: 1053 | version "0.1.0" 1054 | resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 1055 | 1056 | convert-source-map@^1.1.0, convert-source-map@^1.1.1: 1057 | version "1.3.0" 1058 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" 1059 | 1060 | core-js@^2.4.0: 1061 | version "2.4.1" 1062 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 1063 | 1064 | core-util-is@~1.0.0: 1065 | version "1.0.2" 1066 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 1067 | 1068 | cryptiles@2.x.x: 1069 | version "2.0.5" 1070 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 1071 | dependencies: 1072 | boom "2.x.x" 1073 | 1074 | d@^0.1.1, d@~0.1.1: 1075 | version "0.1.1" 1076 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 1077 | dependencies: 1078 | es5-ext "~0.10.2" 1079 | 1080 | damerau-levenshtein@^1.0.0: 1081 | version "1.0.3" 1082 | resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.3.tgz#ae4f4ce0b62acae10ff63a01bb08f652f5213af2" 1083 | 1084 | dashdash@^1.12.0: 1085 | version "1.14.1" 1086 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 1087 | dependencies: 1088 | assert-plus "^1.0.0" 1089 | 1090 | debug@^2.1.1, debug@^2.2.0, debug@2: 1091 | version "2.3.3" 1092 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" 1093 | dependencies: 1094 | ms "0.7.2" 1095 | 1096 | debug@~2.2.0, debug@2.2.0: 1097 | version "2.2.0" 1098 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 1099 | dependencies: 1100 | ms "0.7.1" 1101 | 1102 | decamelize@^1.1.1: 1103 | version "1.2.0" 1104 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 1105 | 1106 | decompress-tar@^3.0.0: 1107 | version "3.1.0" 1108 | resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" 1109 | dependencies: 1110 | is-tar "^1.0.0" 1111 | object-assign "^2.0.0" 1112 | strip-dirs "^1.0.0" 1113 | tar-stream "^1.1.1" 1114 | through2 "^0.6.1" 1115 | vinyl "^0.4.3" 1116 | 1117 | decompress-tarbz2@^3.0.0: 1118 | version "3.1.0" 1119 | resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" 1120 | dependencies: 1121 | is-bzip2 "^1.0.0" 1122 | object-assign "^2.0.0" 1123 | seek-bzip "^1.0.3" 1124 | strip-dirs "^1.0.0" 1125 | tar-stream "^1.1.1" 1126 | through2 "^0.6.1" 1127 | vinyl "^0.4.3" 1128 | 1129 | decompress-targz@^3.0.0: 1130 | version "3.1.0" 1131 | resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" 1132 | dependencies: 1133 | is-gzip "^1.0.0" 1134 | object-assign "^2.0.0" 1135 | strip-dirs "^1.0.0" 1136 | tar-stream "^1.1.1" 1137 | through2 "^0.6.1" 1138 | vinyl "^0.4.3" 1139 | 1140 | decompress-unzip@^3.0.0: 1141 | version "3.4.0" 1142 | resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" 1143 | dependencies: 1144 | is-zip "^1.0.0" 1145 | read-all-stream "^3.0.0" 1146 | stat-mode "^0.2.0" 1147 | strip-dirs "^1.0.0" 1148 | through2 "^2.0.0" 1149 | vinyl "^1.0.0" 1150 | yauzl "^2.2.1" 1151 | 1152 | decompress@^3.0.0: 1153 | version "3.0.0" 1154 | resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" 1155 | dependencies: 1156 | buffer-to-vinyl "^1.0.0" 1157 | concat-stream "^1.4.6" 1158 | decompress-tar "^3.0.0" 1159 | decompress-tarbz2 "^3.0.0" 1160 | decompress-targz "^3.0.0" 1161 | decompress-unzip "^3.0.0" 1162 | stream-combiner2 "^1.1.1" 1163 | vinyl-assign "^1.0.1" 1164 | vinyl-fs "^2.2.0" 1165 | 1166 | deep-eql@^0.1.3: 1167 | version "0.1.3" 1168 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 1169 | dependencies: 1170 | type-detect "0.1.1" 1171 | 1172 | deep-extend@~0.4.0: 1173 | version "0.4.1" 1174 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 1175 | 1176 | deep-is@~0.1.3: 1177 | version "0.1.3" 1178 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 1179 | 1180 | del@^2.0.2: 1181 | version "2.2.2" 1182 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 1183 | dependencies: 1184 | globby "^5.0.0" 1185 | is-path-cwd "^1.0.0" 1186 | is-path-in-cwd "^1.0.0" 1187 | object-assign "^4.0.1" 1188 | pify "^2.0.0" 1189 | pinkie-promise "^2.0.0" 1190 | rimraf "^2.2.8" 1191 | 1192 | delayed-stream@~1.0.0: 1193 | version "1.0.0" 1194 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 1195 | 1196 | delegates@^1.0.0: 1197 | version "1.0.0" 1198 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 1199 | 1200 | detect-indent@^4.0.0: 1201 | version "4.0.0" 1202 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 1203 | dependencies: 1204 | repeating "^2.0.0" 1205 | 1206 | diff@1.4.0: 1207 | version "1.4.0" 1208 | resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" 1209 | 1210 | dirty-chai: 1211 | version "1.2.2" 1212 | resolved "https://registry.yarnpkg.com/dirty-chai/-/dirty-chai-1.2.2.tgz#78495e619635f7fe44219aa4c837849bf183142e" 1213 | 1214 | doctrine@^1.2.2, doctrine@1.5.0: 1215 | version "1.5.0" 1216 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" 1217 | dependencies: 1218 | esutils "^2.0.2" 1219 | isarray "^1.0.0" 1220 | 1221 | duplexer2@~0.1.0: 1222 | version "0.1.4" 1223 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 1224 | dependencies: 1225 | readable-stream "^2.0.2" 1226 | 1227 | duplexify@^3.2.0: 1228 | version "3.5.0" 1229 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" 1230 | dependencies: 1231 | end-of-stream "1.0.0" 1232 | inherits "^2.0.1" 1233 | readable-stream "^2.0.0" 1234 | stream-shift "^1.0.0" 1235 | 1236 | ecc-jsbn@~0.1.1: 1237 | version "0.1.1" 1238 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 1239 | dependencies: 1240 | jsbn "~0.1.0" 1241 | 1242 | end-of-stream@^1.0.0: 1243 | version "1.1.0" 1244 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" 1245 | dependencies: 1246 | once "~1.3.0" 1247 | 1248 | end-of-stream@1.0.0: 1249 | version "1.0.0" 1250 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" 1251 | dependencies: 1252 | once "~1.3.0" 1253 | 1254 | es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 1255 | version "0.10.12" 1256 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 1257 | dependencies: 1258 | es6-iterator "2" 1259 | es6-symbol "~3.1" 1260 | 1261 | es6-iterator@2: 1262 | version "2.0.0" 1263 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 1264 | dependencies: 1265 | d "^0.1.1" 1266 | es5-ext "^0.10.7" 1267 | es6-symbol "3" 1268 | 1269 | es6-map@^0.1.3: 1270 | version "0.1.4" 1271 | resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" 1272 | dependencies: 1273 | d "~0.1.1" 1274 | es5-ext "~0.10.11" 1275 | es6-iterator "2" 1276 | es6-set "~0.1.3" 1277 | es6-symbol "~3.1.0" 1278 | event-emitter "~0.3.4" 1279 | 1280 | es6-promise@3.2.1: 1281 | version "3.2.1" 1282 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" 1283 | 1284 | es6-set@~0.1.3: 1285 | version "0.1.4" 1286 | resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" 1287 | dependencies: 1288 | d "~0.1.1" 1289 | es5-ext "~0.10.11" 1290 | es6-iterator "2" 1291 | es6-symbol "3" 1292 | event-emitter "~0.3.4" 1293 | 1294 | es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: 1295 | version "3.1.0" 1296 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 1297 | dependencies: 1298 | d "~0.1.1" 1299 | es5-ext "~0.10.11" 1300 | 1301 | es6-weak-map@^2.0.1: 1302 | version "2.0.1" 1303 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 1304 | dependencies: 1305 | d "^0.1.1" 1306 | es5-ext "^0.10.8" 1307 | es6-iterator "2" 1308 | es6-symbol "3" 1309 | 1310 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5, escape-string-regexp@1.0.5: 1311 | version "1.0.5" 1312 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 1313 | 1314 | escope@^3.6.0: 1315 | version "3.6.0" 1316 | resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" 1317 | dependencies: 1318 | es6-map "^0.1.3" 1319 | es6-weak-map "^2.0.1" 1320 | esrecurse "^4.1.0" 1321 | estraverse "^4.1.1" 1322 | 1323 | eslint: 1324 | version "3.11.0" 1325 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.11.0.tgz#41d34f8b3e69949beee5c097ff4e75ad13ba2d00" 1326 | dependencies: 1327 | babel-code-frame "^6.16.0" 1328 | chalk "^1.1.3" 1329 | concat-stream "^1.4.6" 1330 | debug "^2.1.1" 1331 | doctrine "^1.2.2" 1332 | escope "^3.6.0" 1333 | espree "^3.3.1" 1334 | estraverse "^4.2.0" 1335 | esutils "^2.0.2" 1336 | file-entry-cache "^2.0.0" 1337 | glob "^7.0.3" 1338 | globals "^9.2.0" 1339 | ignore "^3.2.0" 1340 | imurmurhash "^0.1.4" 1341 | inquirer "^0.12.0" 1342 | is-my-json-valid "^2.10.0" 1343 | is-resolvable "^1.0.0" 1344 | js-yaml "^3.5.1" 1345 | json-stable-stringify "^1.0.0" 1346 | levn "^0.3.0" 1347 | lodash "^4.0.0" 1348 | mkdirp "^0.5.0" 1349 | natural-compare "^1.4.0" 1350 | optionator "^0.8.2" 1351 | path-is-inside "^1.0.1" 1352 | pluralize "^1.2.1" 1353 | progress "^1.1.8" 1354 | require-uncached "^1.0.2" 1355 | shelljs "^0.7.5" 1356 | strip-bom "^3.0.0" 1357 | strip-json-comments "~1.0.1" 1358 | table "^3.7.8" 1359 | text-table "~0.2.0" 1360 | user-home "^2.0.0" 1361 | 1362 | eslint-config-airbnb: 1363 | version "13.0.0" 1364 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-13.0.0.tgz#688d15d3c276c0c753ae538c92a44397d76ae46e" 1365 | dependencies: 1366 | eslint-config-airbnb-base "^10.0.0" 1367 | 1368 | eslint-config-airbnb-base@^10.0.0: 1369 | version "10.0.1" 1370 | resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-10.0.1.tgz#f17d4e52992c1d45d1b7713efbcd5ecd0e7e0506" 1371 | 1372 | eslint-import-resolver-node@^0.2.0: 1373 | version "0.2.3" 1374 | resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" 1375 | dependencies: 1376 | debug "^2.2.0" 1377 | object-assign "^4.0.1" 1378 | resolve "^1.1.6" 1379 | 1380 | eslint-module-utils@^2.0.0: 1381 | version "2.0.0" 1382 | resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" 1383 | dependencies: 1384 | debug "2.2.0" 1385 | pkg-dir "^1.0.0" 1386 | 1387 | eslint-plugin-import: 1388 | version "2.2.0" 1389 | resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" 1390 | dependencies: 1391 | builtin-modules "^1.1.1" 1392 | contains-path "^0.1.0" 1393 | debug "^2.2.0" 1394 | doctrine "1.5.0" 1395 | eslint-import-resolver-node "^0.2.0" 1396 | eslint-module-utils "^2.0.0" 1397 | has "^1.0.1" 1398 | lodash.cond "^4.3.0" 1399 | minimatch "^3.0.3" 1400 | pkg-up "^1.0.0" 1401 | 1402 | eslint-plugin-jsx-a11y@2.2.3: 1403 | version "2.2.3" 1404 | resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz#4e35cb71b8a7db702ac415c806eb8e8d9ea6c65d" 1405 | dependencies: 1406 | damerau-levenshtein "^1.0.0" 1407 | jsx-ast-utils "^1.0.0" 1408 | object-assign "^4.0.1" 1409 | 1410 | eslint-plugin-react: 1411 | version "6.7.1" 1412 | resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz#1af96aea545856825157d97c1b50d5a8fb64a5a7" 1413 | dependencies: 1414 | doctrine "^1.2.2" 1415 | jsx-ast-utils "^1.3.3" 1416 | 1417 | eslint-watch: 1418 | version "2.1.14" 1419 | resolved "https://registry.yarnpkg.com/eslint-watch/-/eslint-watch-2.1.14.tgz#a9d200aefb158349f3631ec91a2ec484d152cbfe" 1420 | dependencies: 1421 | chalk "^1.1.3" 1422 | chokidar "^1.4.3" 1423 | debug "^2.2.0" 1424 | keypress "^0.2.1" 1425 | lodash "^4.13.1" 1426 | optionator "^0.8.1" 1427 | text-table "^0.2.0" 1428 | 1429 | espree@^3.3.1: 1430 | version "3.3.2" 1431 | resolved "https://registry.yarnpkg.com/espree/-/espree-3.3.2.tgz#dbf3fadeb4ecb4d4778303e50103b3d36c88b89c" 1432 | dependencies: 1433 | acorn "^4.0.1" 1434 | acorn-jsx "^3.0.0" 1435 | 1436 | esprima@^2.6.0: 1437 | version "2.7.3" 1438 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 1439 | 1440 | esrecurse@^4.1.0: 1441 | version "4.1.0" 1442 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 1443 | dependencies: 1444 | estraverse "~4.1.0" 1445 | object-assign "^4.0.1" 1446 | 1447 | estraverse@^4.1.1, estraverse@^4.2.0: 1448 | version "4.2.0" 1449 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 1450 | 1451 | estraverse@~4.1.0: 1452 | version "4.1.1" 1453 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 1454 | 1455 | esutils@^2.0.2: 1456 | version "2.0.2" 1457 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 1458 | 1459 | event-emitter@~0.3.4: 1460 | version "0.3.4" 1461 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 1462 | dependencies: 1463 | d "~0.1.1" 1464 | es5-ext "~0.10.7" 1465 | 1466 | exit-hook@^1.0.0: 1467 | version "1.1.1" 1468 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 1469 | 1470 | expand-brackets@^0.1.4: 1471 | version "0.1.5" 1472 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 1473 | dependencies: 1474 | is-posix-bracket "^0.1.0" 1475 | 1476 | expand-range@^1.8.1: 1477 | version "1.8.2" 1478 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 1479 | dependencies: 1480 | fill-range "^2.1.0" 1481 | 1482 | extend-shallow@^2.0.1: 1483 | version "2.0.1" 1484 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 1485 | dependencies: 1486 | is-extendable "^0.1.0" 1487 | 1488 | extend@^3.0.0, extend@~3.0.0, extend@3: 1489 | version "3.0.0" 1490 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 1491 | 1492 | extglob@^0.3.1: 1493 | version "0.3.2" 1494 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 1495 | dependencies: 1496 | is-extglob "^1.0.0" 1497 | 1498 | extsprintf@1.0.2: 1499 | version "1.0.2" 1500 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 1501 | 1502 | fast-levenshtein@~2.0.4: 1503 | version "2.0.5" 1504 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2" 1505 | 1506 | fd-slicer@~1.0.1: 1507 | version "1.0.1" 1508 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 1509 | dependencies: 1510 | pend "~1.2.0" 1511 | 1512 | figures@^1.3.5: 1513 | version "1.7.0" 1514 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 1515 | dependencies: 1516 | escape-string-regexp "^1.0.5" 1517 | object-assign "^4.1.0" 1518 | 1519 | file-entry-cache@^2.0.0: 1520 | version "2.0.0" 1521 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 1522 | dependencies: 1523 | flat-cache "^1.2.1" 1524 | object-assign "^4.0.1" 1525 | 1526 | file-type@^3.1.0: 1527 | version "3.9.0" 1528 | resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" 1529 | 1530 | filename-regex@^2.0.0: 1531 | version "2.0.0" 1532 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 1533 | 1534 | fill-range@^2.1.0: 1535 | version "2.2.3" 1536 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 1537 | dependencies: 1538 | is-number "^2.1.0" 1539 | isobject "^2.0.0" 1540 | randomatic "^1.1.3" 1541 | repeat-element "^1.1.2" 1542 | repeat-string "^1.5.2" 1543 | 1544 | find-up@^1.0.0: 1545 | version "1.1.2" 1546 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 1547 | dependencies: 1548 | path-exists "^2.0.0" 1549 | pinkie-promise "^2.0.0" 1550 | 1551 | first-chunk-stream@^1.0.0: 1552 | version "1.0.0" 1553 | resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" 1554 | 1555 | flat-cache@^1.2.1: 1556 | version "1.2.1" 1557 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.1.tgz#6c837d6225a7de5659323740b36d5361f71691ff" 1558 | dependencies: 1559 | circular-json "^0.3.0" 1560 | del "^2.0.2" 1561 | graceful-fs "^4.1.2" 1562 | write "^0.2.1" 1563 | 1564 | for-in@^0.1.5: 1565 | version "0.1.6" 1566 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" 1567 | 1568 | for-own@^0.1.4: 1569 | version "0.1.4" 1570 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" 1571 | dependencies: 1572 | for-in "^0.1.5" 1573 | 1574 | forever-agent@~0.6.1: 1575 | version "0.6.1" 1576 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 1577 | 1578 | form-data@~2.1.1: 1579 | version "2.1.2" 1580 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 1581 | dependencies: 1582 | asynckit "^0.4.0" 1583 | combined-stream "^1.0.5" 1584 | mime-types "^2.1.12" 1585 | 1586 | fs-readdir-recursive@^1.0.0: 1587 | version "1.0.0" 1588 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 1589 | 1590 | fs.realpath@^1.0.0: 1591 | version "1.0.0" 1592 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1593 | 1594 | fsevents@^1.0.0: 1595 | version "1.0.15" 1596 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44" 1597 | dependencies: 1598 | nan "^2.3.0" 1599 | node-pre-gyp "^0.6.29" 1600 | 1601 | fstream-ignore@~1.0.5: 1602 | version "1.0.5" 1603 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 1604 | dependencies: 1605 | fstream "^1.0.0" 1606 | inherits "2" 1607 | minimatch "^3.0.0" 1608 | 1609 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: 1610 | version "1.0.10" 1611 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" 1612 | dependencies: 1613 | graceful-fs "^4.1.2" 1614 | inherits "~2.0.0" 1615 | mkdirp ">=0.5 0" 1616 | rimraf "2" 1617 | 1618 | function-bind@^1.0.2: 1619 | version "1.1.0" 1620 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 1621 | 1622 | gauge@~2.7.1: 1623 | version "2.7.1" 1624 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.1.tgz#388473894fe8be5e13ffcdb8b93e4ed0616428c7" 1625 | dependencies: 1626 | aproba "^1.0.3" 1627 | console-control-strings "^1.0.0" 1628 | has-color "^0.1.7" 1629 | has-unicode "^2.0.0" 1630 | object-assign "^4.1.0" 1631 | signal-exit "^3.0.0" 1632 | string-width "^1.0.1" 1633 | strip-ansi "^3.0.1" 1634 | wide-align "^1.1.0" 1635 | 1636 | generate-function@^2.0.0: 1637 | version "2.0.0" 1638 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 1639 | 1640 | generate-object-property@^1.1.0: 1641 | version "1.2.0" 1642 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 1643 | dependencies: 1644 | is-property "^1.0.0" 1645 | 1646 | get-stdin@^4.0.1: 1647 | version "4.0.1" 1648 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 1649 | 1650 | getos@^2.7.0: 1651 | version "2.8.2" 1652 | resolved "https://registry.yarnpkg.com/getos/-/getos-2.8.2.tgz#365e7e3b2cf74cb85ebb6d1d8c76633580cee534" 1653 | dependencies: 1654 | async "2.0.1" 1655 | 1656 | getpass@^0.1.1: 1657 | version "0.1.6" 1658 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 1659 | dependencies: 1660 | assert-plus "^1.0.0" 1661 | 1662 | glob-base@^0.3.0: 1663 | version "0.3.0" 1664 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1665 | dependencies: 1666 | glob-parent "^2.0.0" 1667 | is-glob "^2.0.0" 1668 | 1669 | glob-parent@^2.0.0: 1670 | version "2.0.0" 1671 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1672 | dependencies: 1673 | is-glob "^2.0.0" 1674 | 1675 | glob-parent@^3.0.0: 1676 | version "3.0.1" 1677 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.0.1.tgz#60021327cc963ddc3b5f085764f500479ecd82ff" 1678 | dependencies: 1679 | is-glob "^3.1.0" 1680 | path-dirname "^1.0.0" 1681 | 1682 | glob-stream@^5.3.2: 1683 | version "5.3.5" 1684 | resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" 1685 | dependencies: 1686 | extend "^3.0.0" 1687 | glob "^5.0.3" 1688 | glob-parent "^3.0.0" 1689 | micromatch "^2.3.7" 1690 | ordered-read-streams "^0.3.0" 1691 | through2 "^0.6.0" 1692 | to-absolute-glob "^0.1.1" 1693 | unique-stream "^2.0.2" 1694 | 1695 | glob@^5.0.3, glob@^5.0.5: 1696 | version "5.0.15" 1697 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 1698 | dependencies: 1699 | inflight "^1.0.4" 1700 | inherits "2" 1701 | minimatch "2 || 3" 1702 | once "^1.3.0" 1703 | path-is-absolute "^1.0.0" 1704 | 1705 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: 1706 | version "7.1.1" 1707 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 1708 | dependencies: 1709 | fs.realpath "^1.0.0" 1710 | inflight "^1.0.4" 1711 | inherits "2" 1712 | minimatch "^3.0.2" 1713 | once "^1.3.0" 1714 | path-is-absolute "^1.0.0" 1715 | 1716 | glob@7.0.5: 1717 | version "7.0.5" 1718 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" 1719 | dependencies: 1720 | fs.realpath "^1.0.0" 1721 | inflight "^1.0.4" 1722 | inherits "2" 1723 | minimatch "^3.0.2" 1724 | once "^1.3.0" 1725 | path-is-absolute "^1.0.0" 1726 | 1727 | globals@^9.0.0, globals@^9.2.0: 1728 | version "9.14.0" 1729 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" 1730 | 1731 | globby@^5.0.0: 1732 | version "5.0.0" 1733 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 1734 | dependencies: 1735 | array-union "^1.0.1" 1736 | arrify "^1.0.0" 1737 | glob "^7.0.3" 1738 | object-assign "^4.0.1" 1739 | pify "^2.0.0" 1740 | pinkie-promise "^2.0.0" 1741 | 1742 | graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.4: 1743 | version "4.1.11" 1744 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1745 | 1746 | "graceful-readlink@>= 1.0.0": 1747 | version "1.0.1" 1748 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 1749 | 1750 | growl@1.9.2: 1751 | version "1.9.2" 1752 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" 1753 | 1754 | gulp-sourcemaps@1.6.0: 1755 | version "1.6.0" 1756 | resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" 1757 | dependencies: 1758 | convert-source-map "^1.1.1" 1759 | graceful-fs "^4.1.2" 1760 | strip-bom "^2.0.0" 1761 | through2 "^2.0.0" 1762 | vinyl "^1.0.0" 1763 | 1764 | har-validator@~2.0.6: 1765 | version "2.0.6" 1766 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 1767 | dependencies: 1768 | chalk "^1.1.1" 1769 | commander "^2.9.0" 1770 | is-my-json-valid "^2.12.4" 1771 | pinkie-promise "^2.0.0" 1772 | 1773 | has-ansi@^2.0.0: 1774 | version "2.0.0" 1775 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1776 | dependencies: 1777 | ansi-regex "^2.0.0" 1778 | 1779 | has-color@^0.1.7: 1780 | version "0.1.7" 1781 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 1782 | 1783 | has-flag@^1.0.0: 1784 | version "1.0.0" 1785 | resolved "http://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1786 | 1787 | has-unicode@^2.0.0: 1788 | version "2.0.1" 1789 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1790 | 1791 | has@^1.0.1: 1792 | version "1.0.1" 1793 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 1794 | dependencies: 1795 | function-bind "^1.0.2" 1796 | 1797 | hawk@~3.1.3: 1798 | version "3.1.3" 1799 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 1800 | dependencies: 1801 | boom "2.x.x" 1802 | cryptiles "2.x.x" 1803 | hoek "2.x.x" 1804 | sntp "1.x.x" 1805 | 1806 | hoek@2.x.x: 1807 | version "2.16.3" 1808 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 1809 | 1810 | home-or-tmp@^2.0.0: 1811 | version "2.0.0" 1812 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1813 | dependencies: 1814 | os-homedir "^1.0.0" 1815 | os-tmpdir "^1.0.1" 1816 | 1817 | hooks-fixed@1.2.0: 1818 | version "1.2.0" 1819 | resolved "https://registry.yarnpkg.com/hooks-fixed/-/hooks-fixed-1.2.0.tgz#0d2772d4d7d685ff9244724a9f0b5b2559aac96b" 1820 | 1821 | http-signature@~1.1.0: 1822 | version "1.1.1" 1823 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 1824 | dependencies: 1825 | assert-plus "^0.2.0" 1826 | jsprim "^1.2.2" 1827 | sshpk "^1.7.0" 1828 | 1829 | https-proxy-agent@^1.0.0: 1830 | version "1.0.0" 1831 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" 1832 | dependencies: 1833 | agent-base "2" 1834 | debug "2" 1835 | extend "3" 1836 | 1837 | ignore@^3.2.0: 1838 | version "3.2.0" 1839 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435" 1840 | 1841 | imurmurhash@^0.1.4: 1842 | version "0.1.4" 1843 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1844 | 1845 | inflight@^1.0.4: 1846 | version "1.0.6" 1847 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1848 | dependencies: 1849 | once "^1.3.0" 1850 | wrappy "1" 1851 | 1852 | inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@2: 1853 | version "2.0.3" 1854 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1855 | 1856 | ini@~1.3.0: 1857 | version "1.3.4" 1858 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1859 | 1860 | inquirer@^0.12.0: 1861 | version "0.12.0" 1862 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" 1863 | dependencies: 1864 | ansi-escapes "^1.1.0" 1865 | ansi-regex "^2.0.0" 1866 | chalk "^1.0.0" 1867 | cli-cursor "^1.0.1" 1868 | cli-width "^2.0.0" 1869 | figures "^1.3.5" 1870 | lodash "^4.3.0" 1871 | readline2 "^1.0.1" 1872 | run-async "^0.1.0" 1873 | rx-lite "^3.1.2" 1874 | string-width "^1.0.1" 1875 | strip-ansi "^3.0.0" 1876 | through "^2.3.6" 1877 | 1878 | interpret@^1.0.0: 1879 | version "1.0.1" 1880 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" 1881 | 1882 | invariant@^2.2.0: 1883 | version "2.2.2" 1884 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1885 | dependencies: 1886 | loose-envify "^1.0.0" 1887 | 1888 | invert-kv@^1.0.0: 1889 | version "1.0.0" 1890 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1891 | 1892 | is-absolute@^0.1.5: 1893 | version "0.1.7" 1894 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" 1895 | dependencies: 1896 | is-relative "^0.1.0" 1897 | 1898 | is-binary-path@^1.0.0: 1899 | version "1.0.1" 1900 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1901 | dependencies: 1902 | binary-extensions "^1.0.0" 1903 | 1904 | is-buffer@^1.0.2: 1905 | version "1.1.4" 1906 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" 1907 | 1908 | is-bzip2@^1.0.0: 1909 | version "1.0.0" 1910 | resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" 1911 | 1912 | is-dotfile@^1.0.0: 1913 | version "1.0.2" 1914 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1915 | 1916 | is-equal-shallow@^0.1.3: 1917 | version "0.1.3" 1918 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1919 | dependencies: 1920 | is-primitive "^2.0.0" 1921 | 1922 | is-extendable@^0.1.0, is-extendable@^0.1.1: 1923 | version "0.1.1" 1924 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1925 | 1926 | is-extglob@^1.0.0: 1927 | version "1.0.0" 1928 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1929 | 1930 | is-extglob@^2.1.0: 1931 | version "2.1.0" 1932 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.0.tgz#33411a482b046bf95e6b0cb27ee2711af4cf15ad" 1933 | 1934 | is-finite@^1.0.0: 1935 | version "1.0.2" 1936 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1937 | dependencies: 1938 | number-is-nan "^1.0.0" 1939 | 1940 | is-fullwidth-code-point@^1.0.0: 1941 | version "1.0.0" 1942 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1943 | dependencies: 1944 | number-is-nan "^1.0.0" 1945 | 1946 | is-fullwidth-code-point@^2.0.0: 1947 | version "2.0.0" 1948 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1949 | 1950 | is-glob@^2.0.0, is-glob@^2.0.1: 1951 | version "2.0.1" 1952 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1953 | dependencies: 1954 | is-extglob "^1.0.0" 1955 | 1956 | is-glob@^3.1.0: 1957 | version "3.1.0" 1958 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1959 | dependencies: 1960 | is-extglob "^2.1.0" 1961 | 1962 | is-gzip@^1.0.0: 1963 | version "1.0.0" 1964 | resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" 1965 | 1966 | is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: 1967 | version "2.15.0" 1968 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 1969 | dependencies: 1970 | generate-function "^2.0.0" 1971 | generate-object-property "^1.1.0" 1972 | jsonpointer "^4.0.0" 1973 | xtend "^4.0.0" 1974 | 1975 | is-natural-number@^2.0.0: 1976 | version "2.1.1" 1977 | resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" 1978 | 1979 | is-number@^2.0.2, is-number@^2.1.0: 1980 | version "2.1.0" 1981 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1982 | dependencies: 1983 | kind-of "^3.0.2" 1984 | 1985 | is-path-cwd@^1.0.0: 1986 | version "1.0.0" 1987 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 1988 | 1989 | is-path-in-cwd@^1.0.0: 1990 | version "1.0.0" 1991 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" 1992 | dependencies: 1993 | is-path-inside "^1.0.0" 1994 | 1995 | is-path-inside@^1.0.0: 1996 | version "1.0.0" 1997 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 1998 | dependencies: 1999 | path-is-inside "^1.0.1" 2000 | 2001 | is-posix-bracket@^0.1.0: 2002 | version "0.1.1" 2003 | resolved "http://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 2004 | 2005 | is-primitive@^2.0.0: 2006 | version "2.0.0" 2007 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 2008 | 2009 | is-property@^1.0.0: 2010 | version "1.0.2" 2011 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 2012 | 2013 | is-relative@^0.1.0: 2014 | version "0.1.3" 2015 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" 2016 | 2017 | is-resolvable@^1.0.0: 2018 | version "1.0.0" 2019 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" 2020 | dependencies: 2021 | tryit "^1.0.1" 2022 | 2023 | is-stream@^1.0.1: 2024 | version "1.1.0" 2025 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 2026 | 2027 | is-tar@^1.0.0: 2028 | version "1.0.0" 2029 | resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" 2030 | 2031 | is-typedarray@~1.0.0: 2032 | version "1.0.0" 2033 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 2034 | 2035 | is-utf8@^0.2.0: 2036 | version "0.2.1" 2037 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 2038 | 2039 | is-valid-glob@^0.3.0: 2040 | version "0.3.0" 2041 | resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" 2042 | 2043 | is-zip@^1.0.0: 2044 | version "1.0.0" 2045 | resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" 2046 | 2047 | isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: 2048 | version "1.0.0" 2049 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 2050 | 2051 | isarray@0.0.1: 2052 | version "0.0.1" 2053 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 2054 | 2055 | isobject@^2.0.0: 2056 | version "2.1.0" 2057 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 2058 | dependencies: 2059 | isarray "1.0.0" 2060 | 2061 | isstream@~0.1.2: 2062 | version "0.1.2" 2063 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 2064 | 2065 | jodid25519@^1.0.0: 2066 | version "1.0.2" 2067 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 2068 | dependencies: 2069 | jsbn "~0.1.0" 2070 | 2071 | js-tokens@^2.0.0: 2072 | version "2.0.0" 2073 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" 2074 | 2075 | js-yaml@^3.5.1: 2076 | version "3.7.0" 2077 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 2078 | dependencies: 2079 | argparse "^1.0.7" 2080 | esprima "^2.6.0" 2081 | 2082 | jsbn@~0.1.0: 2083 | version "0.1.0" 2084 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" 2085 | 2086 | jsesc@^1.3.0: 2087 | version "1.3.0" 2088 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 2089 | 2090 | jsesc@~0.5.0: 2091 | version "0.5.0" 2092 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 2093 | 2094 | json-schema@0.2.3: 2095 | version "0.2.3" 2096 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 2097 | 2098 | json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: 2099 | version "1.0.1" 2100 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 2101 | dependencies: 2102 | jsonify "~0.0.0" 2103 | 2104 | json-stringify-safe@~5.0.1: 2105 | version "5.0.1" 2106 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 2107 | 2108 | json3@3.3.2: 2109 | version "3.3.2" 2110 | resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" 2111 | 2112 | json5@^0.5.0: 2113 | version "0.5.0" 2114 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.0.tgz#9b20715b026cbe3778fd769edccd822d8332a5b2" 2115 | 2116 | jsonify@~0.0.0: 2117 | version "0.0.0" 2118 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 2119 | 2120 | jsonpointer@^4.0.0: 2121 | version "4.0.0" 2122 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5" 2123 | 2124 | jsprim@^1.2.2: 2125 | version "1.3.1" 2126 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 2127 | dependencies: 2128 | extsprintf "1.0.2" 2129 | json-schema "0.2.3" 2130 | verror "1.3.6" 2131 | 2132 | jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.3: 2133 | version "1.3.4" 2134 | resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.3.4.tgz#0257ed1cc4b1e65b39d7d9940f9fb4f20f7ba0a9" 2135 | dependencies: 2136 | acorn-jsx "^3.0.1" 2137 | object-assign "^4.1.0" 2138 | 2139 | kareem@1.1.3: 2140 | version "1.1.3" 2141 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.1.3.tgz#0877610d8879c38da62d1dbafde4e17f2692f041" 2142 | 2143 | keypress@^0.2.1: 2144 | version "0.2.1" 2145 | resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.2.1.tgz#1e80454250018dbad4c3fe94497d6e67b6269c77" 2146 | 2147 | kind-of@^3.0.2: 2148 | version "3.0.4" 2149 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" 2150 | dependencies: 2151 | is-buffer "^1.0.2" 2152 | 2153 | lazystream@^1.0.0: 2154 | version "1.0.0" 2155 | resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" 2156 | dependencies: 2157 | readable-stream "^2.0.5" 2158 | 2159 | lcid@^1.0.0: 2160 | version "1.0.0" 2161 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 2162 | dependencies: 2163 | invert-kv "^1.0.0" 2164 | 2165 | levn@^0.3.0, levn@~0.3.0: 2166 | version "0.3.0" 2167 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 2168 | dependencies: 2169 | prelude-ls "~1.1.2" 2170 | type-check "~0.3.2" 2171 | 2172 | lodash, lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0: 2173 | version "4.17.2" 2174 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" 2175 | 2176 | lodash._baseassign@^3.0.0: 2177 | version "3.2.0" 2178 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 2179 | dependencies: 2180 | lodash._basecopy "^3.0.0" 2181 | lodash.keys "^3.0.0" 2182 | 2183 | lodash._basecopy@^3.0.0: 2184 | version "3.0.1" 2185 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 2186 | 2187 | lodash._basecreate@^3.0.0: 2188 | version "3.0.3" 2189 | resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" 2190 | 2191 | lodash._getnative@^3.0.0: 2192 | version "3.9.1" 2193 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 2194 | 2195 | lodash._isiterateecall@^3.0.0: 2196 | version "3.0.9" 2197 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 2198 | 2199 | lodash.cond@^4.3.0: 2200 | version "4.5.2" 2201 | resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" 2202 | 2203 | lodash.create@3.1.1: 2204 | version "3.1.1" 2205 | resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" 2206 | dependencies: 2207 | lodash._baseassign "^3.0.0" 2208 | lodash._basecreate "^3.0.0" 2209 | lodash._isiterateecall "^3.0.0" 2210 | 2211 | lodash.isarguments@^3.0.0: 2212 | version "3.1.0" 2213 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 2214 | 2215 | lodash.isarray@^3.0.0: 2216 | version "3.0.4" 2217 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 2218 | 2219 | lodash.isequal@^4.0.0: 2220 | version "4.4.0" 2221 | resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.4.0.tgz#6295768e98e14dc15ce8d362ef6340db82852031" 2222 | 2223 | lodash.keys@^3.0.0: 2224 | version "3.1.2" 2225 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 2226 | dependencies: 2227 | lodash._getnative "^3.0.0" 2228 | lodash.isarguments "^3.0.0" 2229 | lodash.isarray "^3.0.0" 2230 | 2231 | loose-envify@^1.0.0: 2232 | version "1.3.0" 2233 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.0.tgz#6b26248c42f6d4fa4b0d8542f78edfcde35642a8" 2234 | dependencies: 2235 | js-tokens "^2.0.0" 2236 | 2237 | merge-stream@^1.0.0: 2238 | version "1.0.1" 2239 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" 2240 | dependencies: 2241 | readable-stream "^2.0.1" 2242 | 2243 | micromatch@^2.1.5, micromatch@^2.3.7: 2244 | version "2.3.11" 2245 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 2246 | dependencies: 2247 | arr-diff "^2.0.0" 2248 | array-unique "^0.2.1" 2249 | braces "^1.8.2" 2250 | expand-brackets "^0.1.4" 2251 | extglob "^0.3.1" 2252 | filename-regex "^2.0.0" 2253 | is-extglob "^1.0.0" 2254 | is-glob "^2.0.1" 2255 | kind-of "^3.0.2" 2256 | normalize-path "^2.0.1" 2257 | object.omit "^2.0.0" 2258 | parse-glob "^3.0.4" 2259 | regex-cache "^0.4.2" 2260 | 2261 | mime-db@~1.25.0: 2262 | version "1.25.0" 2263 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" 2264 | 2265 | mime-types@^2.1.12, mime-types@~2.1.7: 2266 | version "2.1.13" 2267 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" 2268 | dependencies: 2269 | mime-db "~1.25.0" 2270 | 2271 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, "minimatch@2 || 3": 2272 | version "3.0.3" 2273 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 2274 | dependencies: 2275 | brace-expansion "^1.0.0" 2276 | 2277 | minimist@^1.1.0, minimist@^1.2.0: 2278 | version "1.2.0" 2279 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 2280 | 2281 | minimist@0.0.8: 2282 | version "0.0.8" 2283 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 2284 | 2285 | mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.1, mkdirp@0.5.1, mkdirp@0.5.x: 2286 | version "0.5.1" 2287 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 2288 | dependencies: 2289 | minimist "0.0.8" 2290 | 2291 | mocha: 2292 | version "3.2.0" 2293 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" 2294 | dependencies: 2295 | browser-stdout "1.3.0" 2296 | commander "2.9.0" 2297 | debug "2.2.0" 2298 | diff "1.4.0" 2299 | escape-string-regexp "1.0.5" 2300 | glob "7.0.5" 2301 | growl "1.9.2" 2302 | json3 "3.3.2" 2303 | lodash.create "3.1.1" 2304 | mkdirp "0.5.1" 2305 | supports-color "3.1.2" 2306 | 2307 | mockgoose: 2308 | version "6.0.8" 2309 | resolved "https://registry.yarnpkg.com/mockgoose/-/mockgoose-6.0.8.tgz#6151dde449f5fd3d299681148ca02e9696d82dc6" 2310 | dependencies: 2311 | debug "2.2.0" 2312 | mongodb-prebuilt "^5.0.6" 2313 | portfinder "^1.0.3" 2314 | q "^1.4.1" 2315 | rimraf "^2.5.1" 2316 | 2317 | mongodb-core@2.0.13: 2318 | version "2.0.13" 2319 | resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.0.13.tgz#f9394b588dce0e579482e53d74dbc7d7a9d4519c" 2320 | dependencies: 2321 | bson "~0.5.6" 2322 | require_optional "~1.0.0" 2323 | 2324 | mongodb-download@^1.3.2: 2325 | version "1.3.2" 2326 | resolved "https://registry.yarnpkg.com/mongodb-download/-/mongodb-download-1.3.2.tgz#0a2e8868eaea6c18e2a7f7cb7c8048ff10809337" 2327 | dependencies: 2328 | debug "^2.2.0" 2329 | getos "^2.7.0" 2330 | yargs "^3.26.0" 2331 | 2332 | mongodb-prebuilt@^5.0.6: 2333 | version "5.0.8" 2334 | resolved "https://registry.yarnpkg.com/mongodb-prebuilt/-/mongodb-prebuilt-5.0.8.tgz#82eb96336688888c3a614efbf6c5613fb656fbed" 2335 | dependencies: 2336 | debug "^2.2.0" 2337 | decompress "^3.0.0" 2338 | https-proxy-agent "^1.0.0" 2339 | mongodb-download "^1.3.2" 2340 | spawn-sync "1.0.15" 2341 | yargs "^3.26.0" 2342 | 2343 | mongodb@2.2.11: 2344 | version "2.2.11" 2345 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.11.tgz#a828b036fe6a437a35e723af5f81781c4976306c" 2346 | dependencies: 2347 | es6-promise "3.2.1" 2348 | mongodb-core "2.0.13" 2349 | readable-stream "2.1.5" 2350 | 2351 | mongoose: 2352 | version "4.7.0" 2353 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.7.0.tgz#adb7c6b73dfb76f204a70ba6cd364f887dcc2012" 2354 | dependencies: 2355 | async "2.1.2" 2356 | bson "~0.5.4" 2357 | hooks-fixed "1.2.0" 2358 | kareem "1.1.3" 2359 | mongodb "2.2.11" 2360 | mpath "0.2.1" 2361 | mpromise "0.5.5" 2362 | mquery "2.0.0" 2363 | ms "0.7.1" 2364 | muri "1.1.1" 2365 | regexp-clone "0.0.1" 2366 | sliced "1.0.1" 2367 | 2368 | mpath@0.2.1: 2369 | version "0.2.1" 2370 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.2.1.tgz#3a4e829359801de96309c27a6b2e102e89f9e96e" 2371 | 2372 | mpromise@0.5.5: 2373 | version "0.5.5" 2374 | resolved "https://registry.yarnpkg.com/mpromise/-/mpromise-0.5.5.tgz#f5b24259d763acc2257b0a0c8c6d866fd51732e6" 2375 | 2376 | mquery@2.0.0: 2377 | version "2.0.0" 2378 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-2.0.0.tgz#b5abc850b90dffc3e10ae49b4b6e7a479752df22" 2379 | dependencies: 2380 | bluebird "2.10.2" 2381 | debug "2.2.0" 2382 | regexp-clone "0.0.1" 2383 | sliced "0.0.5" 2384 | 2385 | ms@0.7.1: 2386 | version "0.7.1" 2387 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 2388 | 2389 | ms@0.7.2: 2390 | version "0.7.2" 2391 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 2392 | 2393 | muri@1.1.1: 2394 | version "1.1.1" 2395 | resolved "https://registry.yarnpkg.com/muri/-/muri-1.1.1.tgz#64bd904eaf8ff89600c994441fad3c5195905ac2" 2396 | 2397 | mute-stream@0.0.5: 2398 | version "0.0.5" 2399 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" 2400 | 2401 | nan@^2.3.0: 2402 | version "2.4.0" 2403 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" 2404 | 2405 | natural-compare@^1.4.0: 2406 | version "1.4.0" 2407 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 2408 | 2409 | node-pre-gyp@^0.6.29: 2410 | version "0.6.31" 2411 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.31.tgz#d8a00ddaa301a940615dbcc8caad4024d58f6017" 2412 | dependencies: 2413 | mkdirp "~0.5.1" 2414 | nopt "~3.0.6" 2415 | npmlog "^4.0.0" 2416 | rc "~1.1.6" 2417 | request "^2.75.0" 2418 | rimraf "~2.5.4" 2419 | semver "~5.3.0" 2420 | tar "~2.2.1" 2421 | tar-pack "~3.3.0" 2422 | 2423 | nopt@~3.0.6: 2424 | version "3.0.6" 2425 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 2426 | dependencies: 2427 | abbrev "1" 2428 | 2429 | normalize-path@^2.0.1: 2430 | version "2.0.1" 2431 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" 2432 | 2433 | npmlog@^4.0.0: 2434 | version "4.0.1" 2435 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.1.tgz#d14f503b4cd79710375553004ba96e6662fbc0b8" 2436 | dependencies: 2437 | are-we-there-yet "~1.1.2" 2438 | console-control-strings "~1.1.0" 2439 | gauge "~2.7.1" 2440 | set-blocking "~2.0.0" 2441 | 2442 | number-is-nan@^1.0.0: 2443 | version "1.0.1" 2444 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 2445 | 2446 | oauth-sign@~0.8.1: 2447 | version "0.8.2" 2448 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 2449 | 2450 | object-assign@^2.0.0: 2451 | version "2.1.1" 2452 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" 2453 | 2454 | object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: 2455 | version "4.1.0" 2456 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 2457 | 2458 | object.omit@^2.0.0: 2459 | version "2.0.1" 2460 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 2461 | dependencies: 2462 | for-own "^0.1.4" 2463 | is-extendable "^0.1.1" 2464 | 2465 | once@^1.3.0: 2466 | version "1.4.0" 2467 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2468 | dependencies: 2469 | wrappy "1" 2470 | 2471 | once@~1.3.0, once@~1.3.3: 2472 | version "1.3.3" 2473 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 2474 | dependencies: 2475 | wrappy "1" 2476 | 2477 | onetime@^1.0.0: 2478 | version "1.1.0" 2479 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 2480 | 2481 | optionator@^0.8.1, optionator@^0.8.2: 2482 | version "0.8.2" 2483 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 2484 | dependencies: 2485 | deep-is "~0.1.3" 2486 | fast-levenshtein "~2.0.4" 2487 | levn "~0.3.0" 2488 | prelude-ls "~1.1.2" 2489 | type-check "~0.3.2" 2490 | wordwrap "~1.0.0" 2491 | 2492 | ordered-read-streams@^0.3.0: 2493 | version "0.3.0" 2494 | resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" 2495 | dependencies: 2496 | is-stream "^1.0.1" 2497 | readable-stream "^2.0.1" 2498 | 2499 | os-homedir@^1.0.0: 2500 | version "1.0.2" 2501 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 2502 | 2503 | os-locale@^1.4.0: 2504 | version "1.4.0" 2505 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 2506 | dependencies: 2507 | lcid "^1.0.0" 2508 | 2509 | os-shim@^0.1.2: 2510 | version "0.1.3" 2511 | resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" 2512 | 2513 | os-tmpdir@^1.0.1: 2514 | version "1.0.2" 2515 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 2516 | 2517 | output-file-sync@^1.1.0: 2518 | version "1.1.2" 2519 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 2520 | dependencies: 2521 | graceful-fs "^4.1.4" 2522 | mkdirp "^0.5.1" 2523 | object-assign "^4.1.0" 2524 | 2525 | parse-glob@^3.0.4: 2526 | version "3.0.4" 2527 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 2528 | dependencies: 2529 | glob-base "^0.3.0" 2530 | is-dotfile "^1.0.0" 2531 | is-extglob "^1.0.0" 2532 | is-glob "^2.0.0" 2533 | 2534 | path-dirname@^1.0.0: 2535 | version "1.0.2" 2536 | resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" 2537 | 2538 | path-exists@^2.0.0: 2539 | version "2.1.0" 2540 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 2541 | dependencies: 2542 | pinkie-promise "^2.0.0" 2543 | 2544 | path-is-absolute@^1.0.0: 2545 | version "1.0.1" 2546 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2547 | 2548 | path-is-inside@^1.0.1: 2549 | version "1.0.2" 2550 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 2551 | 2552 | pend@~1.2.0: 2553 | version "1.2.0" 2554 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 2555 | 2556 | pify@^2.0.0: 2557 | version "2.3.0" 2558 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2559 | 2560 | pinkie-promise@^2.0.0: 2561 | version "2.0.1" 2562 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 2563 | dependencies: 2564 | pinkie "^2.0.0" 2565 | 2566 | pinkie@^2.0.0: 2567 | version "2.0.4" 2568 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 2569 | 2570 | pkg-dir@^1.0.0: 2571 | version "1.0.0" 2572 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" 2573 | dependencies: 2574 | find-up "^1.0.0" 2575 | 2576 | pkg-up@^1.0.0: 2577 | version "1.0.0" 2578 | resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" 2579 | dependencies: 2580 | find-up "^1.0.0" 2581 | 2582 | pluralize@^1.2.1: 2583 | version "1.2.1" 2584 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" 2585 | 2586 | portfinder@^1.0.3: 2587 | version "1.0.10" 2588 | resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.10.tgz#7a4de9d98553c315da6f1e1ed05138eeb2d16bb8" 2589 | dependencies: 2590 | async "^1.5.2" 2591 | debug "^2.2.0" 2592 | mkdirp "0.5.x" 2593 | 2594 | prelude-ls@~1.1.2: 2595 | version "1.1.2" 2596 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 2597 | 2598 | preserve@^0.2.0: 2599 | version "0.2.0" 2600 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 2601 | 2602 | private@^0.1.6, private@~0.1.5: 2603 | version "0.1.6" 2604 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" 2605 | 2606 | process-nextick-args@~1.0.6: 2607 | version "1.0.7" 2608 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 2609 | 2610 | progress@^1.1.8: 2611 | version "1.1.8" 2612 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 2613 | 2614 | punycode@^1.4.1: 2615 | version "1.4.1" 2616 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 2617 | 2618 | q@^1.4.1: 2619 | version "1.4.1" 2620 | resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" 2621 | 2622 | qs@~6.3.0: 2623 | version "6.3.0" 2624 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" 2625 | 2626 | randomatic@^1.1.3: 2627 | version "1.1.6" 2628 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 2629 | dependencies: 2630 | is-number "^2.0.2" 2631 | kind-of "^3.0.2" 2632 | 2633 | rc@~1.1.6: 2634 | version "1.1.6" 2635 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 2636 | dependencies: 2637 | deep-extend "~0.4.0" 2638 | ini "~1.3.0" 2639 | minimist "^1.2.0" 2640 | strip-json-comments "~1.0.4" 2641 | 2642 | read-all-stream@^3.0.0: 2643 | version "3.1.0" 2644 | resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" 2645 | dependencies: 2646 | pinkie-promise "^2.0.0" 2647 | readable-stream "^2.0.0" 2648 | 2649 | readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5: 2650 | version "2.2.2" 2651 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" 2652 | dependencies: 2653 | buffer-shims "^1.0.0" 2654 | core-util-is "~1.0.0" 2655 | inherits "~2.0.1" 2656 | isarray "~1.0.0" 2657 | process-nextick-args "~1.0.6" 2658 | string_decoder "~0.10.x" 2659 | util-deprecate "~1.0.1" 2660 | 2661 | "readable-stream@>=1.0.33-1 <1.1.0-0": 2662 | version "1.0.34" 2663 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 2664 | dependencies: 2665 | core-util-is "~1.0.0" 2666 | inherits "~2.0.1" 2667 | isarray "0.0.1" 2668 | string_decoder "~0.10.x" 2669 | 2670 | readable-stream@~2.0.0, readable-stream@~2.0.5: 2671 | version "2.0.6" 2672 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" 2673 | dependencies: 2674 | core-util-is "~1.0.0" 2675 | inherits "~2.0.1" 2676 | isarray "~1.0.0" 2677 | process-nextick-args "~1.0.6" 2678 | string_decoder "~0.10.x" 2679 | util-deprecate "~1.0.1" 2680 | 2681 | readable-stream@~2.1.4, readable-stream@2.1.5: 2682 | version "2.1.5" 2683 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 2684 | dependencies: 2685 | buffer-shims "^1.0.0" 2686 | core-util-is "~1.0.0" 2687 | inherits "~2.0.1" 2688 | isarray "~1.0.0" 2689 | process-nextick-args "~1.0.6" 2690 | string_decoder "~0.10.x" 2691 | util-deprecate "~1.0.1" 2692 | 2693 | readdirp@^2.0.0: 2694 | version "2.1.0" 2695 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 2696 | dependencies: 2697 | graceful-fs "^4.1.2" 2698 | minimatch "^3.0.2" 2699 | readable-stream "^2.0.2" 2700 | set-immediate-shim "^1.0.1" 2701 | 2702 | readline2@^1.0.1: 2703 | version "1.0.1" 2704 | resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" 2705 | dependencies: 2706 | code-point-at "^1.0.0" 2707 | is-fullwidth-code-point "^1.0.0" 2708 | mute-stream "0.0.5" 2709 | 2710 | rechoir@^0.6.2: 2711 | version "0.6.2" 2712 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 2713 | dependencies: 2714 | resolve "^1.1.6" 2715 | 2716 | regenerate@^1.2.1: 2717 | version "1.3.2" 2718 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 2719 | 2720 | regenerator-runtime@^0.9.5: 2721 | version "0.9.6" 2722 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" 2723 | 2724 | regex-cache@^0.4.2: 2725 | version "0.4.3" 2726 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 2727 | dependencies: 2728 | is-equal-shallow "^0.1.3" 2729 | is-primitive "^2.0.0" 2730 | 2731 | regexp-clone@0.0.1: 2732 | version "0.0.1" 2733 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" 2734 | 2735 | regexpu-core@^2.0.0: 2736 | version "2.0.0" 2737 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 2738 | dependencies: 2739 | regenerate "^1.2.1" 2740 | regjsgen "^0.2.0" 2741 | regjsparser "^0.1.4" 2742 | 2743 | regjsgen@^0.2.0: 2744 | version "0.2.0" 2745 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 2746 | 2747 | regjsparser@^0.1.4: 2748 | version "0.1.5" 2749 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 2750 | dependencies: 2751 | jsesc "~0.5.0" 2752 | 2753 | repeat-element@^1.1.2: 2754 | version "1.1.2" 2755 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2756 | 2757 | repeat-string@^1.5.2: 2758 | version "1.6.1" 2759 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2760 | 2761 | repeating@^2.0.0: 2762 | version "2.0.1" 2763 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2764 | dependencies: 2765 | is-finite "^1.0.0" 2766 | 2767 | replace-ext@0.0.1: 2768 | version "0.0.1" 2769 | resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" 2770 | 2771 | request@^2.75.0: 2772 | version "2.79.0" 2773 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 2774 | dependencies: 2775 | aws-sign2 "~0.6.0" 2776 | aws4 "^1.2.1" 2777 | caseless "~0.11.0" 2778 | combined-stream "~1.0.5" 2779 | extend "~3.0.0" 2780 | forever-agent "~0.6.1" 2781 | form-data "~2.1.1" 2782 | har-validator "~2.0.6" 2783 | hawk "~3.1.3" 2784 | http-signature "~1.1.0" 2785 | is-typedarray "~1.0.0" 2786 | isstream "~0.1.2" 2787 | json-stringify-safe "~5.0.1" 2788 | mime-types "~2.1.7" 2789 | oauth-sign "~0.8.1" 2790 | qs "~6.3.0" 2791 | stringstream "~0.0.4" 2792 | tough-cookie "~2.3.0" 2793 | tunnel-agent "~0.4.1" 2794 | uuid "^3.0.0" 2795 | 2796 | require_optional@~1.0.0: 2797 | version "1.0.0" 2798 | resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.0.tgz#52a86137a849728eb60a55533617f8f914f59abf" 2799 | dependencies: 2800 | resolve-from "^2.0.0" 2801 | semver "^5.1.0" 2802 | 2803 | require-uncached@^1.0.2: 2804 | version "1.0.3" 2805 | resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 2806 | dependencies: 2807 | caller-path "^0.1.0" 2808 | resolve-from "^1.0.0" 2809 | 2810 | resolve-from@^1.0.0: 2811 | version "1.0.1" 2812 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 2813 | 2814 | resolve-from@^2.0.0: 2815 | version "2.0.0" 2816 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" 2817 | 2818 | resolve@^1.1.6: 2819 | version "1.1.7" 2820 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 2821 | 2822 | restore-cursor@^1.0.1: 2823 | version "1.0.1" 2824 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 2825 | dependencies: 2826 | exit-hook "^1.0.0" 2827 | onetime "^1.0.0" 2828 | 2829 | rimraf@^2.2.8, rimraf@^2.5.1, rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: 2830 | version "2.5.4" 2831 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 2832 | dependencies: 2833 | glob "^7.0.5" 2834 | 2835 | run-async@^0.1.0: 2836 | version "0.1.0" 2837 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" 2838 | dependencies: 2839 | once "^1.3.0" 2840 | 2841 | rx-lite@^3.1.2: 2842 | version "3.1.2" 2843 | resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" 2844 | 2845 | seek-bzip@^1.0.3: 2846 | version "1.0.5" 2847 | resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" 2848 | dependencies: 2849 | commander "~2.8.1" 2850 | 2851 | semver@^5.1.0, semver@~5.3.0: 2852 | version "5.3.0" 2853 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 2854 | 2855 | semver@~5.0.1: 2856 | version "5.0.3" 2857 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" 2858 | 2859 | set-blocking@~2.0.0: 2860 | version "2.0.0" 2861 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2862 | 2863 | set-immediate-shim@^1.0.1: 2864 | version "1.0.1" 2865 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 2866 | 2867 | shelljs@^0.7.5: 2868 | version "0.7.5" 2869 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" 2870 | dependencies: 2871 | glob "^7.0.0" 2872 | interpret "^1.0.0" 2873 | rechoir "^0.6.2" 2874 | 2875 | signal-exit@^3.0.0: 2876 | version "3.0.1" 2877 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.1.tgz#5a4c884992b63a7acd9badb7894c3ee9cfccad81" 2878 | 2879 | slash@^1.0.0: 2880 | version "1.0.0" 2881 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2882 | 2883 | slice-ansi@0.0.4: 2884 | version "0.0.4" 2885 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 2886 | 2887 | sliced@0.0.5: 2888 | version "0.0.5" 2889 | resolved "http://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz#5edc044ca4eb6f7816d50ba2fc63e25d8fe4707f" 2890 | 2891 | sliced@1.0.1: 2892 | version "1.0.1" 2893 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 2894 | 2895 | sntp@1.x.x: 2896 | version "1.0.9" 2897 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 2898 | dependencies: 2899 | hoek "2.x.x" 2900 | 2901 | source-map-support@^0.4.2: 2902 | version "0.4.6" 2903 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" 2904 | dependencies: 2905 | source-map "^0.5.3" 2906 | 2907 | source-map@^0.5.0, source-map@^0.5.3: 2908 | version "0.5.6" 2909 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 2910 | 2911 | spawn-sync@1.0.15: 2912 | version "1.0.15" 2913 | resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" 2914 | dependencies: 2915 | concat-stream "^1.4.7" 2916 | os-shim "^0.1.2" 2917 | 2918 | sprintf-js@~1.0.2: 2919 | version "1.0.3" 2920 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2921 | 2922 | sshpk@^1.7.0: 2923 | version "1.10.1" 2924 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0" 2925 | dependencies: 2926 | asn1 "~0.2.3" 2927 | assert-plus "^1.0.0" 2928 | dashdash "^1.12.0" 2929 | getpass "^0.1.1" 2930 | optionalDependencies: 2931 | bcrypt-pbkdf "^1.0.0" 2932 | ecc-jsbn "~0.1.1" 2933 | jodid25519 "^1.0.0" 2934 | jsbn "~0.1.0" 2935 | tweetnacl "~0.14.0" 2936 | 2937 | stat-mode@^0.2.0: 2938 | version "0.2.2" 2939 | resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" 2940 | 2941 | stream-combiner2@^1.1.1: 2942 | version "1.1.1" 2943 | resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" 2944 | dependencies: 2945 | duplexer2 "~0.1.0" 2946 | readable-stream "^2.0.2" 2947 | 2948 | stream-shift@^1.0.0: 2949 | version "1.0.0" 2950 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 2951 | 2952 | string_decoder@~0.10.x: 2953 | version "0.10.31" 2954 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2955 | 2956 | string-width@^1.0.1: 2957 | version "1.0.2" 2958 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2959 | dependencies: 2960 | code-point-at "^1.0.0" 2961 | is-fullwidth-code-point "^1.0.0" 2962 | strip-ansi "^3.0.0" 2963 | 2964 | string-width@^2.0.0: 2965 | version "2.0.0" 2966 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 2967 | dependencies: 2968 | is-fullwidth-code-point "^2.0.0" 2969 | strip-ansi "^3.0.0" 2970 | 2971 | stringstream@~0.0.4: 2972 | version "0.0.5" 2973 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2974 | 2975 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2976 | version "3.0.1" 2977 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2978 | dependencies: 2979 | ansi-regex "^2.0.0" 2980 | 2981 | strip-bom-stream@^1.0.0: 2982 | version "1.0.0" 2983 | resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" 2984 | dependencies: 2985 | first-chunk-stream "^1.0.0" 2986 | strip-bom "^2.0.0" 2987 | 2988 | strip-bom@^2.0.0: 2989 | version "2.0.0" 2990 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2991 | dependencies: 2992 | is-utf8 "^0.2.0" 2993 | 2994 | strip-bom@^3.0.0: 2995 | version "3.0.0" 2996 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2997 | 2998 | strip-dirs@^1.0.0: 2999 | version "1.1.1" 3000 | resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" 3001 | dependencies: 3002 | chalk "^1.0.0" 3003 | get-stdin "^4.0.1" 3004 | is-absolute "^0.1.5" 3005 | is-natural-number "^2.0.0" 3006 | minimist "^1.1.0" 3007 | sum-up "^1.0.1" 3008 | 3009 | strip-json-comments@~1.0.1, strip-json-comments@~1.0.4: 3010 | version "1.0.4" 3011 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 3012 | 3013 | sum-up@^1.0.1: 3014 | version "1.0.3" 3015 | resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" 3016 | dependencies: 3017 | chalk "^1.0.0" 3018 | 3019 | supports-color@^2.0.0: 3020 | version "2.0.0" 3021 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 3022 | 3023 | supports-color@3.1.2: 3024 | version "3.1.2" 3025 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" 3026 | dependencies: 3027 | has-flag "^1.0.0" 3028 | 3029 | table@^3.7.8: 3030 | version "3.8.3" 3031 | resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" 3032 | dependencies: 3033 | ajv "^4.7.0" 3034 | ajv-keywords "^1.0.0" 3035 | chalk "^1.1.1" 3036 | lodash "^4.0.0" 3037 | slice-ansi "0.0.4" 3038 | string-width "^2.0.0" 3039 | 3040 | tar-pack@~3.3.0: 3041 | version "3.3.0" 3042 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" 3043 | dependencies: 3044 | debug "~2.2.0" 3045 | fstream "~1.0.10" 3046 | fstream-ignore "~1.0.5" 3047 | once "~1.3.3" 3048 | readable-stream "~2.1.4" 3049 | rimraf "~2.5.1" 3050 | tar "~2.2.1" 3051 | uid-number "~0.0.6" 3052 | 3053 | tar-stream@^1.1.1: 3054 | version "1.5.2" 3055 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.2.tgz#fbc6c6e83c1a19d4cb48c7d96171fc248effc7bf" 3056 | dependencies: 3057 | bl "^1.0.0" 3058 | end-of-stream "^1.0.0" 3059 | readable-stream "^2.0.0" 3060 | xtend "^4.0.0" 3061 | 3062 | tar@~2.2.1: 3063 | version "2.2.1" 3064 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 3065 | dependencies: 3066 | block-stream "*" 3067 | fstream "^1.0.2" 3068 | inherits "2" 3069 | 3070 | text-table@^0.2.0, text-table@~0.2.0: 3071 | version "0.2.0" 3072 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 3073 | 3074 | through@^2.3.6: 3075 | version "2.3.8" 3076 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 3077 | 3078 | through2-filter@^2.0.0: 3079 | version "2.0.0" 3080 | resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" 3081 | dependencies: 3082 | through2 "~2.0.0" 3083 | xtend "~4.0.0" 3084 | 3085 | through2@^0.6.0, through2@^0.6.1: 3086 | version "0.6.5" 3087 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" 3088 | dependencies: 3089 | readable-stream ">=1.0.33-1 <1.1.0-0" 3090 | xtend ">=4.0.0 <4.1.0-0" 3091 | 3092 | through2@^2.0.0, through2@~2.0.0: 3093 | version "2.0.1" 3094 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" 3095 | dependencies: 3096 | readable-stream "~2.0.0" 3097 | xtend "~4.0.0" 3098 | 3099 | to-absolute-glob@^0.1.1: 3100 | version "0.1.1" 3101 | resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" 3102 | dependencies: 3103 | extend-shallow "^2.0.1" 3104 | 3105 | to-fast-properties@^1.0.1: 3106 | version "1.0.2" 3107 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 3108 | 3109 | tough-cookie@~2.3.0: 3110 | version "2.3.2" 3111 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 3112 | dependencies: 3113 | punycode "^1.4.1" 3114 | 3115 | tryit@^1.0.1: 3116 | version "1.0.3" 3117 | resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" 3118 | 3119 | tunnel-agent@~0.4.1: 3120 | version "0.4.3" 3121 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 3122 | 3123 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 3124 | version "0.14.3" 3125 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d" 3126 | 3127 | type-check@~0.3.2: 3128 | version "0.3.2" 3129 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 3130 | dependencies: 3131 | prelude-ls "~1.1.2" 3132 | 3133 | type-detect@^1.0.0: 3134 | version "1.0.0" 3135 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 3136 | 3137 | type-detect@0.1.1: 3138 | version "0.1.1" 3139 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 3140 | 3141 | typedarray@~0.0.5: 3142 | version "0.0.6" 3143 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 3144 | 3145 | uid-number@~0.0.6: 3146 | version "0.0.6" 3147 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 3148 | 3149 | unique-stream@^2.0.2: 3150 | version "2.2.1" 3151 | resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" 3152 | dependencies: 3153 | json-stable-stringify "^1.0.0" 3154 | through2-filter "^2.0.0" 3155 | 3156 | user-home@^1.1.1: 3157 | version "1.1.1" 3158 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 3159 | 3160 | user-home@^2.0.0: 3161 | version "2.0.0" 3162 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" 3163 | dependencies: 3164 | os-homedir "^1.0.0" 3165 | 3166 | util-deprecate@~1.0.1: 3167 | version "1.0.2" 3168 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 3169 | 3170 | uuid@^2.0.1: 3171 | version "2.0.3" 3172 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 3173 | 3174 | uuid@^3.0.0: 3175 | version "3.0.0" 3176 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.0.tgz#6728fc0459c450d796a99c31837569bdf672d728" 3177 | 3178 | v8flags@^2.0.10: 3179 | version "2.0.11" 3180 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" 3181 | dependencies: 3182 | user-home "^1.1.1" 3183 | 3184 | vali-date@^1.0.0: 3185 | version "1.0.0" 3186 | resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" 3187 | 3188 | verror@1.3.6: 3189 | version "1.3.6" 3190 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 3191 | dependencies: 3192 | extsprintf "1.0.2" 3193 | 3194 | vinyl-assign@^1.0.1: 3195 | version "1.2.1" 3196 | resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" 3197 | dependencies: 3198 | object-assign "^4.0.1" 3199 | readable-stream "^2.0.0" 3200 | 3201 | vinyl-fs@^2.2.0: 3202 | version "2.4.4" 3203 | resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" 3204 | dependencies: 3205 | duplexify "^3.2.0" 3206 | glob-stream "^5.3.2" 3207 | graceful-fs "^4.0.0" 3208 | gulp-sourcemaps "1.6.0" 3209 | is-valid-glob "^0.3.0" 3210 | lazystream "^1.0.0" 3211 | lodash.isequal "^4.0.0" 3212 | merge-stream "^1.0.0" 3213 | mkdirp "^0.5.0" 3214 | object-assign "^4.0.0" 3215 | readable-stream "^2.0.4" 3216 | strip-bom "^2.0.0" 3217 | strip-bom-stream "^1.0.0" 3218 | through2 "^2.0.0" 3219 | through2-filter "^2.0.0" 3220 | vali-date "^1.0.0" 3221 | vinyl "^1.0.0" 3222 | 3223 | vinyl@^0.4.3: 3224 | version "0.4.6" 3225 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" 3226 | dependencies: 3227 | clone "^0.2.0" 3228 | clone-stats "^0.0.1" 3229 | 3230 | vinyl@^1.0.0: 3231 | version "1.2.0" 3232 | resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" 3233 | dependencies: 3234 | clone "^1.0.0" 3235 | clone-stats "^0.0.1" 3236 | replace-ext "0.0.1" 3237 | 3238 | wide-align@^1.1.0: 3239 | version "1.1.0" 3240 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 3241 | dependencies: 3242 | string-width "^1.0.1" 3243 | 3244 | window-size@^0.1.4: 3245 | version "0.1.4" 3246 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" 3247 | 3248 | wordwrap@~1.0.0: 3249 | version "1.0.0" 3250 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 3251 | 3252 | wrap-ansi@^2.0.0: 3253 | version "2.0.0" 3254 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.0.0.tgz#7d30f8f873f9a5bbc3a64dabc8d177e071ae426f" 3255 | dependencies: 3256 | string-width "^1.0.1" 3257 | 3258 | wrappy@1: 3259 | version "1.0.2" 3260 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 3261 | 3262 | write@^0.2.1: 3263 | version "0.2.1" 3264 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 3265 | dependencies: 3266 | mkdirp "^0.5.1" 3267 | 3268 | xtend@^4.0.0, "xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.0: 3269 | version "4.0.1" 3270 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 3271 | 3272 | y18n@^3.2.0: 3273 | version "3.2.1" 3274 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 3275 | 3276 | yargs@^3.26.0: 3277 | version "3.32.0" 3278 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" 3279 | dependencies: 3280 | camelcase "^2.0.1" 3281 | cliui "^3.0.3" 3282 | decamelize "^1.1.1" 3283 | os-locale "^1.4.0" 3284 | string-width "^1.0.1" 3285 | window-size "^0.1.4" 3286 | y18n "^3.2.0" 3287 | 3288 | yauzl@^2.2.1: 3289 | version "2.7.0" 3290 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.7.0.tgz#e21d847868b496fc29eaec23ee87fdd33e9b2bce" 3291 | dependencies: 3292 | buffer-crc32 "~0.2.3" 3293 | fd-slicer "~1.0.1" 3294 | 3295 | --------------------------------------------------------------------------------