diff --git a/packages/babel-settings/package.json b/packages/babel-settings/package.json index a6a0521ed9..5034c009f8 100644 --- a/packages/babel-settings/package.json +++ b/packages/babel-settings/package.json @@ -13,7 +13,6 @@ }, "scripts": {}, "dependencies": { - "babel-runtime": "^6.26.0", "babel-cli": "6.26.0", "babel-core": "^6.26.3", "babel-plugin-transform-class-properties": "^6.24.1", @@ -25,6 +24,7 @@ "babel-preset-env": "^1.6.1", "babel-preset-react": "^6.24.1", "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", "fs-extra": "^6.0.0", "jsonc-parser": "^2.0.0" } diff --git a/packages/eslint-settings/.eslintrc.js b/packages/eslint-settings/.eslintrc.js index 861a85fb57..e8340a9126 100644 --- a/packages/eslint-settings/.eslintrc.js +++ b/packages/eslint-settings/.eslintrc.js @@ -32,6 +32,15 @@ module.exports = { "function-paren-newline": 0, "class-methods-use-this": 0, "comma-dangle": 0, + "prefer-destructuring": [ + 2, + { + "AssignmentExpression": { + "array": false, + "object": false, + }, + } + ], "import/extensions": "off", "import/no-extraneous-dependencies": 1, "import/no-unresolved": 1, diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 5ed5f3a3f3..7cad302d1d 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -20,9 +20,9 @@ "devDependencies": { "faker": "^4.1.0", "fs-extra": "^6.0.0", + "gulp": "^3.9.1", "gulp-babel": "^7.0.1", "gulp-sourcemaps": "^2.6.4", - "gulp": "^3.9.1", "jest": "^22.4.3" }, "scripts": { diff --git a/packages/phone-number/gulpfile.babel.js b/packages/phone-number/gulpfile.babel.js new file mode 100644 index 0000000000..ce01a61648 --- /dev/null +++ b/packages/phone-number/gulpfile.babel.js @@ -0,0 +1,76 @@ +import gulp from 'gulp'; +import path from 'path'; +import fs from 'fs-extra'; +import babel from 'gulp-babel'; +import sourcemaps from 'gulp-sourcemaps'; +import cp from 'child_process'; + +gulp.task('clean', async () => ( + fs.remove(path.resolve(__dirname, 'build')) +)); + +gulp.task('build', ['clean'], () => ( + gulp.src([ + './lib/**/*.js', + '!./lib/**/*.test.js', + './*.js', + '!./gulpfile*.js', + ], { + base: './' + }) + .pipe(sourcemaps.init()) + .pipe(babel()) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest('build')) +)); + +async function exec(command) { + return new Promise((resolve, reject) => { + cp.exec(command, (error, stdout) => { + if (error) { + reject(error); + return; + } + resolve(stdout); + }); + }); +} + +async function getVersionFromTag() { + try { + let tag = await exec('git describe --exact-match --tags $(git rev-parse HEAD)'); + tag = tag.replace(/\r?\n|\r/g, ''); + if (/^\d+.\d+.\d+/.test(tag)) { + return tag; + } + return null; + } catch (e) { + return null; + } +} + +gulp.task('release-clean', async () => { + if (!await fs.exists('release')) { + await fs.mkdir('release'); + } + const files = (await fs.readdir('release')).filter(file => !/^\./.test(file)); + for (const file of files) { + await fs.remove(path.resolve(__dirname, 'release', file)); + } +}); + +gulp.task('release-copy', ['build', 'release-clean'], () => ( + gulp.src(['build/**', 'README.md', 'LICENSE']) + .pipe(gulp.dest('release')) +)); + +gulp.task('release', ['release-copy'], async () => { + const packageInfo = JSON.parse(await fs.readFile('package.json')); + delete packageInfo.scripts; + delete packageInfo.devDependencies; + const version = await getVersionFromTag(); + if (version) { + packageInfo.version = version; + } + await fs.writeFile('release/package.json', JSON.stringify(packageInfo, null, 2)); +}); diff --git a/packages/phone-number/index.js b/packages/phone-number/index.js new file mode 100644 index 0000000000..6c9e992293 --- /dev/null +++ b/packages/phone-number/index.js @@ -0,0 +1,10 @@ +import format, { formatTypes } from './lib/format'; +import detect from './lib/detect'; +import parse from './lib/parse'; + +export { + format, + detect, + parse, + formatTypes, +}; diff --git a/packages/phone-number/lib/detect/index.js b/packages/phone-number/lib/detect/index.js new file mode 100644 index 0000000000..a8dc7da747 --- /dev/null +++ b/packages/phone-number/lib/detect/index.js @@ -0,0 +1,62 @@ +import { findPhoneNumbers } from 'libphonenumber-js'; +import { forEach, find } from 'ramda'; +import parse from '../parse'; + +function find7DigitNumbers(input, countryCode) { + const output = []; + const regex = /(?:^|[^\d\w#/])((?:\d[-\s]{0,1}){7,12}(?=[^\d]|$))/g; + + let match; + do { + match = regex.exec(input); + if (match) { + const { + isValid, + phoneNumber, + hasPlus, + } = parse({ input: match[0], countryCode }); + if (isValid && !hasPlus && phoneNumber.length === 7) { + output.push({ + country: countryCode, + phone: phoneNumber, + startsAt: match.index, + endsAt: match.index + match[0].length, + }); + } + } + } while (match); + return output; +} + +function byStartsAt(a, b) { + return a.startsAt - b.startsAt; +} + +export default function detect({ input, countryCode = 'US', areaCode = '' }) { + const output = findPhoneNumbers(input, countryCode); + if ( + (countryCode === 'US' || countryCode === 'CA') && + areaCode.length === 3 + ) { + const sevenDigits = find7DigitNumbers(input, countryCode); + if (sevenDigits.length) { + // keep a reference of the original output to search in + const ref = output.slice(); + forEach( + (item) => { + if (!find( + entry => ( + entry.startsAt <= item.startsAt && + entry.endsAt >= item.startsAt + ), + ref, + )) { + output.push(item); + } + }, + sevenDigits, + ); + } + } + return output.sort(byStartsAt); +} diff --git a/packages/phone-number/lib/detect/index.test.js b/packages/phone-number/lib/detect/index.test.js new file mode 100644 index 0000000000..d1a222c4f4 --- /dev/null +++ b/packages/phone-number/lib/detect/index.test.js @@ -0,0 +1,138 @@ +import detect from './'; + +const withPlus = [ + '+54 115 236 0151', + '+61 2 8310 8040', + '+43 1267 5659', + '+32 2 808 91 42', + '+22 96 150 9868', + '+55 11 4380 8033', + '+35 92 491 5120', + '+1 587 316 4436', + '+1 780 666 9719', + '+1 902 701 0543', + '+1 438 794 7820', + '+1 613 699 2642', + '+1 418 478 1534', + '+1 306 500 6992', + '+1 506 799 5774', + '+1 647 494 4053', + '+1 604 259 2561', + '+1 204 500 0720', + '+86 21 8024 5697', + '+385 1 7776 206', + '+357 22 222173', + '+420 255 719 520', + '+45 32 70 05 98', + '+18 29 947 5214', + '+50 32 136 7471', + '+37 2 880 7860', + '+358 9 42411127', + '+33 173 078 713', + '+49 307 6759 848', + '+233 24 242 6021', + '+302 11 198 7281', + '+224 66 071 0308', + '+85 25 803 4545', + '+36 1 255 0356', + '+353 1 487 0050', + '+972 39 350 644', + '+39 068 997 1954', + '+81 6 4560 2947', + '+254 20 5293 367', + '+37 16 616 3975', + '+37 05 214 1729', + '+352 2786 1971', + '+52 558 526 4582', + '+31 10 798 6126', + '+644 280 7452', + '+47 21 93 97 86', + '+507 833 8962', + '+511 707 1429', + '+48 22 116 84 79', + '+351 308 807 355', + '+17 87 945 0332', + '+40 356 780 163', + '+653 158 3925', + '+421 233 325736', + '+386 1 600 31 04', + '+27 21 205 6202', + '+34 935 22 01 25', + '+46 85 050 17 23', + '+41 22 560 74 07', + '+886 27 705 4479', + '+90 212 900 3677', + '+44 203 875 4507', + '+1 773 231 9226', + '+16504371071', + '+1 (650)437-1071', + '+1(650)437 1071', + '+1 (650) 437-1071', + '+1 650 437 1071', +]; +const usNumbers = [ + '16504371071', + '(650)437-1071', + '(650)437 1071', + '650 437 1071', + '1 650 437 1071', + '1.650.437.1071', + '650.437.1071', + '1-650-437-1071', +]; +const sevenDigits = [ + '437 1071', + '437-1071', +]; + +const countryCodes = [ + 'US', + 'CA', + 'GB', + 'FR', + 'DE', +]; + +describe('detect', () => { + describe('numbers with +{country}', () => { + test('should be detected regardless of default country', () => { + withPlus.forEach((item) => { + countryCodes.forEach((code) => { + const matches = detect({ input: item, countryCode: code }); + expect(matches.length).toBe(1); + expect(item.substring(matches[0].startsAt, matches[0].endsAt)).toBe(item); + }); + }); + }); + test('should detect numbers without + if number is dialable in the defaultCountry', () => { + usNumbers.forEach((item) => { + const matches = detect({ input: item, countryCode: 'US' }); + expect(matches.length).toBe(1); + expect(item.substring(matches[0].startsAt, matches[0].endsAt)).toBe(item); + }); + }); + test('should accept 7-digit numbers if defaultCountry is US or CA and areaCode is given', () => { + sevenDigits.forEach((item) => { + let matches = detect({ input: item, countryCode: 'US', areaCode: '650' }); + expect(matches.length).toBe(1); + expect(item.substring(matches[0].startsAt, matches[0].endsAt)).toBe(item); + matches = detect({ input: item, countryCode: 'CA', areaCode: '416' }); + expect(matches.length).toBe(1); + expect(item.substring(matches[0].startsAt, matches[0].endsAt)).toBe(item); + }); + }); + test('should detect all numbers from input', () => { + const matches = detect({ + input: ` + hello world +46 85 050 17 23 + +886 27 705 4479, test: 112-7772, + more number: 339-1476 + long number: +41 22 560 74 07, + `, + countryCode: 'CA', + areaCode: '416' + }); + expect(matches.length).toBe(5); + }); + }); +}); diff --git a/packages/phone-number/lib/format/index.js b/packages/phone-number/lib/format/index.js new file mode 100644 index 0000000000..e1e2f0bc1d --- /dev/null +++ b/packages/phone-number/lib/format/index.js @@ -0,0 +1,69 @@ +import { formatNumber } from 'libphonenumber-js'; +import parse from '../parse'; + +const formatTypes = { + local: 'local', + international: 'international', + e164: 'e164' +}; + +export { formatTypes }; + +export default function format({ + phoneNumber, + countryCode = 'US', + areaCode = '', + type = formatTypes.local, + removeExtension = false, + extensionDelimeter = ' * ', +}) { + const { + phoneNumber: number, + extension, + country, + isExtension, + isServiceNumber, + isValid, + hasPlus, + } = parse({ input: phoneNumber, countryCode }); + + if (!isValid) { + return ''; + } + if ( + isServiceNumber || + isExtension + ) { + return number; + } + const isUSCA = countryCode === 'CA' || countryCode === 'US'; + const withAreaCode = (!hasPlus && isUSCA && countryCode && countryCode !== '') ? + `${areaCode}${number}` : + number; + + let finalType; + if (type === formatTypes.e164) { + finalType = 'E.164'; + } else if (type === formatTypes.international) { + finalType = 'International'; + } else { + finalType = ( + // assume local + !country || + // ignore US/CA difference + isUSCA && (country === 'US' || country === 'CA') || + country === countryCode + ) ? + 'National' : + 'International'; + } + + const formattedNumber = formatNumber( + withAreaCode, + country || countryCode, + finalType, + ); + return extension && !removeExtension ? + `${formattedNumber}${extensionDelimeter}${extension}` : + formattedNumber; +} diff --git a/packages/phone-number/lib/format/index.test.js b/packages/phone-number/lib/format/index.test.js new file mode 100644 index 0000000000..c1fc4a3252 --- /dev/null +++ b/packages/phone-number/lib/format/index.test.js @@ -0,0 +1,183 @@ +import format, { formatTypes } from './index'; + +describe('format', () => { + test('should return a string', () => { + expect(typeof format({ phoneNumber: '12345' })).toBe('string'); + expect(typeof format({ phoneNumber: '+1 650-361-8700' })).toBe('string'); + }); + + test('should return empty string if no numbers are in the input string', () => { + expect(format({ phoneNumber: 'foo' })).toBe(''); + expect(format({ phoneNumber: 'bar' })).toBe(''); + }); + + test('should default to US', () => { + const phoneNumber = '1234567890'; + expect(format({ phoneNumber })) + .toBe(format({ phoneNumber, countryCode: 'US' })); + }); + + test('should format a number', () => { + const phoneNumber = '1234567890'; + expect(format({ phoneNumber }).length) + .not.toBe(phoneNumber.length); + }); + + test('should default to local format', () => { + const phoneNumber = '1234567890'; + expect(format({ phoneNumber })) + .toBe(format({ phoneNumber, type: formatTypes.local })); + }); + test('should return number as extension if number is shorter than 7 digits', () => { + [ + '1', + '12', + '123', + '12345', + '12345*12345', + '123456', + ].forEach((phoneNumber) => { + expect(format({ + phoneNumber, + })).toBe(phoneNumber.split('*').pop()); + }); + }); + test('should only remove extension number if params.removeExtension is true', () => { + const phoneNumber = '1234567890'; + const extension = '123'; + expect(format({ + phoneNumber: `${phoneNumber}*${extension}`, + removeExtension: true, + })).toBe(format({ phoneNumber })); + expect(format({ + phoneNumber: `${phoneNumber}*${extension}`, + removeExtension: false, + })).toBe(format({ phoneNumber: `${phoneNumber}*${extension}` })); + }); + + test('should add areaCode if phoneNumber is 7 digits and countryCode is US or CA', () => { + const phoneNumber = '1234567'; + const areaCode = '890'; + expect(format({ + phoneNumber, + areaCode, + countryCode: 'US' + })).toBe(format({ + phoneNumber: `${areaCode}${phoneNumber}`, + countryCode: 'US', + })); + expect(format({ + phoneNumber, + areaCode, + countryCode: 'CA' + })).toBe(format({ + phoneNumber: `${areaCode}${phoneNumber}`, + countryCode: 'CA', + })); + }); + + test('should ignore areaCode if countryCode is not US or CA', () => { + const phoneNumber = '1234567'; + const areaCode = '890'; + expect(format({ + phoneNumber, + areaCode, + countryCode: 'GB' + })).toBe(format({ + phoneNumber, + countryCode: 'GB', + })); + }); + + test('should not differentiate US and CA numbers', () => { + const ca = [ + '+1-613-555-0177', + '+1-613-555-0174', + '+1-613-555-0194', + '+1-613-555-0189', + '+1-613-555-0127', + '+1-613-555-0105', + ]; + const us = [ + '+1-202-555-0139', + '+1-202-555-0142', + '+1-202-555-0139', + '+1-202-555-0169', + '+1-202-555-0187', + '+1-202-555-0177', + ]; + ca.forEach((n) => { + expect(format({ + phoneNumber: n, + countryCode: 'US' + })).toBe(format({ + phoneNumber: n, + countryCode: 'CA', + })); + }); + us.forEach((n) => { + expect(format({ + phoneNumber: n, + countryCode: 'US' + })).toBe(format({ + phoneNumber: n, + countryCode: 'CA', + })); + }); + }); + + test('should differentiate between other NA numbers', () => { + const phoneNumber = '+17872628888'; // Puerto Rico Pizza Hut + expect(format({ + phoneNumber, + countryCode: 'US' + })[0] === '+').toBe(true); + }); + test('should format to localFormat if phoneNumber matchs countryCode', () => { + expect(format({ + phoneNumber: '+1-202-555-0139', + countryCode: 'US' + })[0] !== '+').toBe(true); + expect(format({ + phoneNumber: '202-555-0139', + countryCode: 'US' + })[0] !== '+').toBe(true); + expect(format({ + phoneNumber: '+44 20 7930 9114', + countryCode: 'GB' + })[0] !== '+').toBe(true); + expect(format({ + phoneNumber: '20 7930 9114', + countryCode: 'GB' + })[0] !== '+').toBe(true); + expect(format({ + phoneNumber: '+1-202-555-0139', + countryCode: 'US' + })).toBe('(202) 555-0139'); + expect(format({ + phoneNumber: '+44 20 7930 9114', + countryCode: 'GB' + })).toBe('020 7930 9114'); + }); + test('should format to international format if options.international is set to true', () => { + expect(format({ + phoneNumber: '+1-202-555-0139', + countryCode: 'US', + type: formatTypes.international, + })).toBe(format({ + phoneNumber: '+1-202-555-0139', + countryCode: 'GB', + })); + }); + test('should format to international format if phoneNumber not match courtryCode', () => { + expect(format({ + phoneNumber: '+44-202-555-0139', + countryCode: 'US', + })).toBe(format({ + phoneNumber: '+44-202-555-0139', + countryCode: 'US', + type: formatTypes.international, + })); + }); +}); + diff --git a/packages/phone-number/lib/parse/index.js b/packages/phone-number/lib/parse/index.js new file mode 100644 index 0000000000..2efafde6b3 --- /dev/null +++ b/packages/phone-number/lib/parse/index.js @@ -0,0 +1,62 @@ +import { parseNumber } from 'libphonenumber-js'; + +const invalidCharsRegExp = /[^\d*+#\-(). ]/; +const cleanRegex = /[^\d*+#]/g; +const plusRegex = /\+/g; +const extensionDelimiter = /[*#]/g; + +export default function parse({ input, countryCode = 'US' }) { + const result = { + input, + country: null, + isValid: true, + hasInvalidChars: invalidCharsRegExp.test(input), + isExtension: false, + isServiceNumber: false, + hasPlus: false, + phoneNumber: null, + extension: null, + }; + const cleanInput = input.replace(cleanRegex, ''); + const startWithPlus = cleanInput[0] === '+'; + const withoutPlus = cleanInput.replace(plusRegex, ''); + const startWithStar = withoutPlus[0] === '*'; + if (startWithPlus && startWithStar) { + result.isValid = false; + } else { + const tokens = withoutPlus.split(extensionDelimiter); + if (startWithStar) { + if (tokens[1] && tokens[1].length) { + result.isServiceNumber = true; + result.phoneNumber = `*${tokens[1]}`; + } else { + result.isValid = false; + } + } else if (startWithPlus) { + if (tokens[0] && tokens[0].length) { + result.hasPlus = true; + result.phoneNumber = `+${tokens[0]}`; + result.country = parseNumber(result.phoneNumber, countryCode).country || null; + if (tokens[1] && tokens[1].length) { + result.extension = tokens[1]; + } + } else { + result.isValid = false; + } + } else if (tokens[0] && tokens[0].length) { + if (tokens[0].length > 6) { + result.phoneNumber = tokens[0]; + result.country = parseNumber(result.phoneNumber, countryCode).country || null; + if (tokens[1] && tokens[1].length) { + result.extension = tokens[1]; + } + } else { + result.isExtension = true; + result.phoneNumber = tokens[0]; + } + } else { + result.isValid = false; + } + } + return result; +} diff --git a/packages/phone-number/lib/parse/index.test.js b/packages/phone-number/lib/parse/index.test.js new file mode 100644 index 0000000000..7385f92eb5 --- /dev/null +++ b/packages/phone-number/lib/parse/index.test.js @@ -0,0 +1,138 @@ +import parse from '.'; + +// const pizzahutUS = '+1 650-361-8700'; +const pizzahutUK = '+44 1473 748635'; + + +describe('parse', () => { + test('detect invalid characters', () => { + expect(parse({ input: 'abc' }).isValid).toBe(false); + }); + test('detect invalid numbers', () => { + expect(parse({ input: '' }).isValid).toBe(false); + expect(parse({ input: '+*234' }).isValid).toBe(false); + expect(parse({ input: '+' }).isValid).toBe(false); + }); + + test('parse correct number', () => { + expect(parse({ input: '+1 650-361-8700' })).toEqual({ + input: '+1 650-361-8700', + isServiceNumber: false, + hasInvalidChars: false, + isExtension: false, + country: 'US', + phoneNumber: '+16503618700', + extension: null, + isValid: true, + hasPlus: true, + }); + }); + + test('detect country', () => { + expect(parse({ input: pizzahutUK })).toEqual({ + input: pizzahutUK, + isServiceNumber: false, + hasInvalidChars: false, + isExtension: false, + country: 'GB', + phoneNumber: '+441473748635', + extension: null, + isValid: true, + hasPlus: true, + }); + }); + + test('parse correct number without +', () => { + expect(parse({ input: '1 650-361-8700' })).toEqual({ + input: '1 650-361-8700', + isServiceNumber: false, + hasInvalidChars: false, + isExtension: false, + country: 'US', + phoneNumber: '16503618700', + extension: null, + isValid: true, + hasPlus: false, + }); + }); + + test('parse correct number without country code', () => { + expect(parse({ input: '650-361-8700' })).toEqual({ + input: '650-361-8700', + isServiceNumber: false, + hasInvalidChars: false, + isExtension: false, + country: 'US', + phoneNumber: '6503618700', + extension: null, + isValid: true, + hasPlus: false, + }); + }); + + test('parse number with extension', () => { + expect(parse({ input: '650-361-8700 * 123' })).toEqual({ + input: '650-361-8700 * 123', + isServiceNumber: false, + hasInvalidChars: false, + isExtension: false, + country: 'US', + phoneNumber: '6503618700', + extension: '123', + isValid: true, + hasPlus: false, + }); + expect(parse({ input: '+1 650-361-8700 * 123' })).toEqual({ + input: '+1 650-361-8700 * 123', + isServiceNumber: false, + hasInvalidChars: false, + isExtension: false, + country: 'US', + phoneNumber: '+16503618700', + extension: '123', + isValid: true, + hasPlus: true, + }); + }); + + test('parse service number', () => { + expect(parse({ input: '*123' })).toEqual({ + input: '*123', + isServiceNumber: true, + hasInvalidChars: false, + isExtension: false, + country: null, + phoneNumber: '*123', + extension: null, + isValid: true, + hasPlus: false, + }); + }); + + test('parse extension number', () => { + expect(parse({ input: '123456' })).toEqual({ + input: '123456', + isServiceNumber: false, + hasInvalidChars: false, + isExtension: true, + country: null, + phoneNumber: '123456', + extension: null, + isValid: true, + hasPlus: false, + }); + }); + test('parse short number with +', () => { + expect(parse({ input: '+123456' })).toEqual({ + input: '+123456', + isServiceNumber: false, + hasInvalidChars: false, + isExtension: false, + country: null, + phoneNumber: '+123456', + extension: null, + isValid: true, + hasPlus: true, + }); + }); +}); diff --git a/packages/phone-number/package.json b/packages/phone-number/package.json new file mode 100644 index 0000000000..0435385916 --- /dev/null +++ b/packages/phone-number/package.json @@ -0,0 +1,31 @@ +{ + "name": "@ringcentral-integration/phone-number", + "version": "1.0.0", + "description": "Wrapper around libphonenumber-js to provide RingCentral specific phone handling.", + "main": "index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/ringcentral/ringcentral-js-widgets.git" + }, + "author": "RingCentral Integrations", + "license": "MIT", + "bugs": { + "url": "https://github.com/ringcentral/ringcentral-js-widgets/issues" + }, + "homepage": "https://github.com/ringcentral/ringcentral-js-widgets#readme", + "private": false, + "dependencies": { + "libphonenumber-js": "^1.2.11", + "ramda": "^0.25.0" + }, + "peerDependencies": { + "babel-runtime": "^6.26.0" + }, + "devDependencies": { + "fs-extra": "^6.0.1", + "gulp": "^3.9.1", + "gulp-babel": "^7.0.1", + "gulp-sourcemaps": "^2.6.4", + "jest": "^22.4.4" + } +} diff --git a/yarn.lock b/yarn.lock index 97a7704436..164999f704 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,10 +9,10 @@ "@babel/highlight" "7.0.0-beta.44" "@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-beta.46" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz#e0d002100805daab1461c0fcb32a07e304f3a4f4" + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27" dependencies: - "@babel/highlight" "7.0.0-beta.46" + "@babel/highlight" "7.0.0-beta.47" "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" @@ -52,9 +52,9 @@ esutils "^2.0.2" js-tokens "^3.0.0" -"@babel/highlight@7.0.0-beta.46": - version "7.0.0-beta.46" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.46.tgz#c553c51e65f572bdedd6eff66fc0bb563016645e" +"@babel/highlight@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494" dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -551,17 +551,23 @@ async@1.x, async@^1.4.0, async@^1.5.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.0.0, async@^2.1.2, async@^2.1.4, async@^2.5.0: +async@^2.0.0, async@^2.1.2, async@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: lodash "^4.14.0" +async@^2.1.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + dependencies: + lodash "^4.17.10" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -atob@^2.0.0: +atob@^2.0.0, atob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" @@ -812,12 +818,12 @@ babel-istanbul@^0.12.1: which "1.2.x" wordwrap "1.0.x" -babel-jest@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.3.tgz#4b7a0b6041691bbd422ab49b3b73654a49a6627a" +babel-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.4.tgz#977259240420e227444ebe49e226a61e49ea659d" dependencies: babel-plugin-istanbul "^4.1.5" - babel-preset-jest "^22.4.3" + babel-preset-jest "^22.4.4" babel-loader@^7.0.0: version "7.1.4" @@ -848,9 +854,9 @@ babel-plugin-istanbul@^4.1.5: istanbul-lib-instrument "^1.10.1" test-exclude "^4.2.1" -babel-plugin-jest-hoist@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz#7d8bcccadc2667f96a0dcc6afe1891875ee6c14a" +babel-plugin-jest-hoist@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz#b9851906eab34c7bf6f8c895a2b08bea1a844c0b" babel-plugin-react-svg@^2.1.0: version "2.1.0" @@ -1221,11 +1227,11 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" -babel-preset-jest@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz#e92eef9813b7026ab4ca675799f37419b5a44156" +babel-preset-jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz#ec9fbd8bcd7dfd24b8b5320e0e688013235b7c39" dependencies: - babel-plugin-jest-hoist "^22.4.3" + babel-plugin-jest-hoist "^22.4.4" babel-plugin-syntax-object-rest-spread "^6.13.0" babel-preset-react@^6.24.1: @@ -2175,8 +2181,8 @@ compare-func@^1.3.1: dot-prop "^3.0.0" compare-versions@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5" + version "3.2.1" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.2.1.tgz#a49eb7689d4caaf0b6db5220173fd279614000f7" component-bind@1.0.0: version "1.0.0" @@ -2484,11 +2490,11 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.2.0, core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: +core-js@^2.2.0, core-js@^2.4.1: version "2.5.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" -core-js@^2.5.6: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.6: version "2.5.6" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d" @@ -2715,9 +2721,9 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" -"cssstyle@>= 0.2.37 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" +"cssstyle@>= 0.3.1 < 0.4.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" dependencies: cssom "0.3.x" @@ -3767,7 +3773,7 @@ expect.js@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.3.1.tgz#b0a59a0d2eff5437544ebf0ceaa6015841d09b5b" -expect@^22.4.3: +expect@^22.4.0: version "22.4.3" resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" dependencies: @@ -3979,12 +3985,12 @@ fileset@^2.0.2: minimatch "^3.0.3" fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" @@ -4213,9 +4219,9 @@ fs-extra@^4.0.1, fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.0.tgz#0f0afb290bb3deb87978da816fcd3c7797f3a817" +fs-extra@^6.0.0, fs-extra@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b" dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -4244,13 +4250,20 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0, fsevents@^1.1.2, fsevents@^1.2.3: +fsevents@^1.0.0, fsevents@^1.1.2: version "1.2.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.3.tgz#08292982e7059f6674c93d8b829c1e8604979ac0" dependencies: nan "^2.9.2" node-pre-gyp "^0.9.0" +fsevents@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" @@ -5040,12 +5053,18 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.21" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" dependencies: safer-buffer "^2.1.0" +iconv-lite@^0.4.4: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + dependencies: + safer-buffer ">= 2.1.2 < 3" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -5689,15 +5708,15 @@ istanbul@^0.4.0, istanbul@~0.4.5: which "^1.1.1" wordwrap "^1.0.0" -jest-changed-files@^22.4.3: +jest-changed-files@^22.2.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" dependencies: throat "^4.0.0" -jest-cli@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.3.tgz#bf16c4a5fb7edc3fa5b9bb7819e34139e88a72c7" +jest-cli@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.4.tgz#68cd2a2aae983adb1e6638248ca21082fd6d9e90" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" @@ -5710,20 +5729,20 @@ jest-cli@^22.4.3: istanbul-lib-coverage "^1.1.1" istanbul-lib-instrument "^1.8.0" istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^22.4.3" - jest-config "^22.4.3" - jest-environment-jsdom "^22.4.3" - jest-get-type "^22.4.3" - jest-haste-map "^22.4.3" - jest-message-util "^22.4.3" - jest-regex-util "^22.4.3" - jest-resolve-dependencies "^22.4.3" - jest-runner "^22.4.3" - jest-runtime "^22.4.3" - jest-snapshot "^22.4.3" - jest-util "^22.4.3" - jest-validate "^22.4.3" - jest-worker "^22.4.3" + jest-changed-files "^22.2.0" + jest-config "^22.4.4" + jest-environment-jsdom "^22.4.1" + jest-get-type "^22.1.0" + jest-haste-map "^22.4.2" + jest-message-util "^22.4.0" + jest-regex-util "^22.1.0" + jest-resolve-dependencies "^22.1.0" + jest-runner "^22.4.4" + jest-runtime "^22.4.4" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" + jest-validate "^22.4.4" + jest-worker "^22.2.2" micromatch "^2.3.11" node-notifier "^5.2.1" realpath-native "^1.0.0" @@ -5734,23 +5753,23 @@ jest-cli@^22.4.3: which "^1.2.12" yargs "^10.0.3" -jest-config@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.3.tgz#0e9d57db267839ea31309119b41dc2fa31b76403" +jest-config@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.4.tgz#72a521188720597169cd8b4ff86934ef5752d86a" dependencies: chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^22.4.3" - jest-environment-node "^22.4.3" - jest-get-type "^22.4.3" - jest-jasmine2 "^22.4.3" - jest-regex-util "^22.4.3" - jest-resolve "^22.4.3" - jest-util "^22.4.3" - jest-validate "^22.4.3" - pretty-format "^22.4.3" - -jest-diff@^22.4.3: + jest-environment-jsdom "^22.4.1" + jest-environment-node "^22.4.1" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.4.4" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" + pretty-format "^22.4.0" + +jest-diff@^22.4.0, jest-diff@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" dependencies: @@ -5759,13 +5778,13 @@ jest-diff@^22.4.3: jest-get-type "^22.4.3" pretty-format "^22.4.3" -jest-docblock@^22.4.3: +jest-docblock@^22.4.0, jest-docblock@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" dependencies: detect-newline "^2.1.0" -jest-environment-jsdom@^22.4.3: +jest-environment-jsdom@^22.4.1: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" dependencies: @@ -5773,18 +5792,18 @@ jest-environment-jsdom@^22.4.3: jest-util "^22.4.3" jsdom "^11.5.1" -jest-environment-node@^22.4.3: +jest-environment-node@^22.4.1: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" dependencies: jest-mock "^22.4.3" jest-util "^22.4.3" -jest-get-type@^22.4.3: +jest-get-type@^22.1.0, jest-get-type@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" -jest-haste-map@^22.4.3: +jest-haste-map@^22.4.2: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" dependencies: @@ -5796,29 +5815,29 @@ jest-haste-map@^22.4.3: micromatch "^2.3.11" sane "^2.0.0" -jest-jasmine2@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz#4daf64cd14c793da9db34a7c7b8dcfe52a745965" +jest-jasmine2@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz#c55f92c961a141f693f869f5f081a79a10d24e23" dependencies: chalk "^2.0.1" co "^4.6.0" - expect "^22.4.3" + expect "^22.4.0" graceful-fs "^4.1.11" is-generator-fn "^1.0.0" - jest-diff "^22.4.3" - jest-matcher-utils "^22.4.3" - jest-message-util "^22.4.3" - jest-snapshot "^22.4.3" - jest-util "^22.4.3" + jest-diff "^22.4.0" + jest-matcher-utils "^22.4.0" + jest-message-util "^22.4.0" + jest-snapshot "^22.4.0" + jest-util "^22.4.1" source-map-support "^0.5.0" -jest-leak-detector@^22.4.3: +jest-leak-detector@^22.4.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" dependencies: pretty-format "^22.4.3" -jest-matcher-utils@^22.4.3: +jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" dependencies: @@ -5826,7 +5845,7 @@ jest-matcher-utils@^22.4.3: jest-get-type "^22.4.3" pretty-format "^22.4.3" -jest-message-util@^22.4.3: +jest-message-util@^22.4.0, jest-message-util@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" dependencies: @@ -5840,56 +5859,56 @@ jest-mock@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" -jest-regex-util@^22.4.3: +jest-regex-util@^22.1.0, jest-regex-util@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" -jest-resolve-dependencies@^22.4.3: +jest-resolve-dependencies@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" dependencies: jest-regex-util "^22.4.3" -jest-resolve@^22.4.3: +jest-resolve@^22.4.2: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" dependencies: browser-resolve "^1.11.2" chalk "^2.0.1" -jest-runner@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.3.tgz#298ddd6a22b992c64401b4667702b325e50610c3" +jest-runner@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.4.tgz#dfca7b7553e0fa617e7b1291aeb7ce83e540a907" dependencies: exit "^0.1.2" - jest-config "^22.4.3" - jest-docblock "^22.4.3" - jest-haste-map "^22.4.3" - jest-jasmine2 "^22.4.3" - jest-leak-detector "^22.4.3" - jest-message-util "^22.4.3" - jest-runtime "^22.4.3" - jest-util "^22.4.3" - jest-worker "^22.4.3" + jest-config "^22.4.4" + jest-docblock "^22.4.0" + jest-haste-map "^22.4.2" + jest-jasmine2 "^22.4.4" + jest-leak-detector "^22.4.0" + jest-message-util "^22.4.0" + jest-runtime "^22.4.4" + jest-util "^22.4.1" + jest-worker "^22.2.2" throat "^4.0.0" -jest-runtime@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.3.tgz#b69926c34b851b920f666c93e86ba2912087e3d0" +jest-runtime@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.4.tgz#9ba7792fc75582a5be0f79af6f8fe8adea314048" dependencies: babel-core "^6.0.0" - babel-jest "^22.4.3" + babel-jest "^22.4.4" babel-plugin-istanbul "^4.1.5" chalk "^2.0.1" convert-source-map "^1.4.0" exit "^0.1.2" graceful-fs "^4.1.11" - jest-config "^22.4.3" - jest-haste-map "^22.4.3" - jest-regex-util "^22.4.3" - jest-resolve "^22.4.3" - jest-util "^22.4.3" - jest-validate "^22.4.3" + jest-config "^22.4.4" + jest-haste-map "^22.4.2" + jest-regex-util "^22.1.0" + jest-resolve "^22.4.2" + jest-util "^22.4.1" + jest-validate "^22.4.4" json-stable-stringify "^1.0.1" micromatch "^2.3.11" realpath-native "^1.0.0" @@ -5902,7 +5921,7 @@ jest-serializer@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" -jest-snapshot@^22.4.3: +jest-snapshot@^22.4.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" dependencies: @@ -5913,7 +5932,7 @@ jest-snapshot@^22.4.3: natural-compare "^1.4.0" pretty-format "^22.4.3" -jest-util@^22.4.3: +jest-util@^22.4.1, jest-util@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" dependencies: @@ -5925,28 +5944,28 @@ jest-util@^22.4.3: mkdirp "^0.5.1" source-map "^0.6.0" -jest-validate@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.3.tgz#0780954a5a7daaeec8d3c10834b9280865976b30" +jest-validate@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.4.tgz#1dd0b616ef46c995de61810d85f57119dbbcec4d" dependencies: chalk "^2.0.1" - jest-config "^22.4.3" - jest-get-type "^22.4.3" + jest-config "^22.4.4" + jest-get-type "^22.1.0" leven "^2.1.0" - pretty-format "^22.4.3" + pretty-format "^22.4.0" -jest-worker@^22.4.3: +jest-worker@^22.2.2, jest-worker@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" dependencies: merge-stream "^1.0.1" -jest@^22.4.3: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.3.tgz#2261f4b117dc46d9a4a1a673d2150958dee92f16" +jest@^22.4.3, jest@^22.4.4: + version "22.4.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.4.tgz#ffb36c9654b339a13e10b3d4b338eb3e9d49f6eb" dependencies: import-local "^1.0.0" - jest-cli "^22.4.3" + jest-cli "^22.4.4" js-base64@^2.1.8, js-base64@^2.1.9: version "2.4.3" @@ -5982,21 +6001,21 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" jsdom@^11.5.1: - version "11.10.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.10.0.tgz#a42cd54e88895dc765f03f15b807a474962ac3b5" + version "11.11.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" dependencies: abab "^1.0.4" acorn "^5.3.0" acorn-globals "^4.1.0" array-equal "^1.0.0" cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" + cssstyle ">= 0.3.1 < 0.4.0" data-urls "^1.0.0" domexception "^1.0.0" escodegen "^1.9.0" html-encoding-sniffer "^1.0.2" left-pad "^1.2.0" - nwmatcher "^1.4.3" + nwsapi "^2.0.0" parse5 "4.0.0" pn "^1.1.0" request "^2.83.0" @@ -6008,7 +6027,7 @@ jsdom@^11.5.1: webidl-conversions "^4.0.2" whatwg-encoding "^1.0.3" whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.0" + whatwg-url "^6.4.1" ws "^4.0.0" xml-name-validator "^3.0.0" @@ -6316,6 +6335,14 @@ lexical-scope@^1.2.0: dependencies: astw "^2.0.0" +libphonenumber-js@^1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.2.11.tgz#c751a3557273f29a75554be0ae12d851637c907b" + dependencies: + minimist "^1.2.0" + semver-compare "^1.0.0" + xml2js "^0.4.17" + liftoff@^2.1.0: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" @@ -6558,7 +6585,7 @@ lodash@3.x, lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.17.2, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.17.2, lodash@~4.17.4: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -6624,13 +6651,20 @@ lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" -lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2: +lru-cache@4.1.x, lru-cache@^4.1.1, lru-cache@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^4.0.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-queue@0.1: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" @@ -6685,6 +6719,10 @@ math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" +math-random@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" + md5.js@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" @@ -6888,11 +6926,11 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -minipass@^2.2.1, minipass@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" dependencies: - safe-buffer "^5.1.1" + safe-buffer "^5.1.2" yallist "^3.0.0" minizlib@^1.1.0: @@ -7208,6 +7246,21 @@ node-notifier@^5.2.1: shellwords "^0.1.1" which "^1.3.0" +node-pre-gyp@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.0" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.1.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.9.0: version "0.9.1" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" @@ -7345,9 +7398,9 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -nwmatcher@^1.4.3: - version "1.4.4" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" +nwsapi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.0.tgz#7c8faf4ad501e1d17a651ebc5547f966b547c5c7" oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" @@ -8204,7 +8257,7 @@ prettier@^1.7.0: version "1.12.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.12.1.tgz#c1ad20e803e7749faf905a409d2367e06bbe7325" -pretty-format@^22.4.3: +pretty-format@^22.4.0, pretty-format@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" dependencies: @@ -8345,8 +8398,8 @@ punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" punycode@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" pure-color@^1.2.0: version "1.3.0" @@ -8360,7 +8413,7 @@ qjobs@^1.1.4: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" -qs@6.5.1, qs@^6.5.1, qs@~6.5.1: +qs@6.5.1, qs@^6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -8368,6 +8421,10 @@ qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" +qs@~6.5.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + query-string@^4.1.0, query-string@^4.2.2: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -8416,12 +8473,13 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" +randomatic@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" @@ -8970,7 +9028,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2, request@^2.83.0: +request@2: version "2.85.0" resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" dependencies: @@ -9022,6 +9080,31 @@ request@2.79.0, request@~2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" +request@^2.83.0: + version "2.87.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -9194,7 +9277,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -9236,7 +9319,7 @@ sass-loader@^6.0.5: neo-async "^2.5.0" pify "^3.0.0" -sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -9264,6 +9347,10 @@ selfsigned@^1.9.1: dependencies: node-forge "0.7.1" +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" @@ -9598,7 +9685,17 @@ source-map-loader@^0.2.1: loader-utils "~0.2.2" source-map "~0.6.1" -source-map-resolve@^0.5.0, source-map-resolve@^0.5.1: +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-resolve@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" dependencies: @@ -9615,8 +9712,8 @@ source-map-support@^0.4.0, source-map-support@^0.4.15: source-map "^0.5.6" source-map-support@^0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.5.tgz#0d4af9e00493e855402e8ec36ebed2d266fceb90" + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -9867,10 +9964,14 @@ string_decoder@~1.0.0: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4, stringstream@~0.0.5: +stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +stringstream@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -10055,12 +10156,12 @@ tar@^2.0.0: inherits "2" tar@^4: - version "4.4.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.2.tgz#60685211ba46b38847b1ae7ee1a24d744a2cd462" + version "4.4.3" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.3.tgz#d6bd509dc7f6b5a5d2c13aa0f7d57b03269b8376" dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" - minipass "^2.2.4" + minipass "^2.3.3" minizlib "^1.1.0" mkdirp "^0.5.0" safe-buffer "^5.1.2" @@ -10751,7 +10852,7 @@ whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" -whatwg-url@^6.4.0: +whatwg-url@^6.4.0, whatwg-url@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67" dependencies: @@ -10883,10 +10984,21 @@ xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" +xml2js@^0.4.17: + version "0.4.19" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + dependencies: + sax ">=0.6.0" + xmlbuilder "~9.0.1" + xmlbuilder@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" +xmlbuilder@~9.0.1: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"