├── .gitignore ├── .jest └── ts-preprocessor.js ├── LICENSE ├── README.md ├── examples ├── 00-switch │ ├── switch.test.ts │ └── switch.ts ├── 01-separation-of-concerns │ ├── separation-of-concerns.test.ts │ └── separation-of-concerns.ts ├── 02-truly-reusable │ ├── truly-reusable.test.ts │ └── truly-reusable.ts ├── 03-union-types │ ├── __snapshots__ │ │ └── union-types.test.ts.snap │ ├── union-types.test.ts │ └── union-types.ts └── 04-real-life-problem-domain │ ├── real-life-problem-domain.test.ts │ └── real-life-problem-domain.ts ├── package-lock.json ├── package.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | build 3 | node_modules 4 | 5 | -------------------------------------------------------------------------------- /.jest/ts-preprocessor.js: -------------------------------------------------------------------------------- 1 | const tsc = require('typescript'); 2 | const tsConfig = require('../tsconfig.json'); 3 | 4 | module.exports = { 5 | process(src, path) { 6 | if (path.endsWith('.ts') || path.endsWith('.tsx')) { 7 | return tsc.transpile(src, tsConfig.compilerOptions, path, []); 8 | } 9 | return src; 10 | } 11 | }; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Manuel Alabor 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pattern Matching with TypeScript 2 | 3 | > [TypeScript](https://www.typescriptlang.org/index.html) does not have any pattern matching functionality built in. This article shows several ways how you can replicate the core of a simple pattern matcher using a few simple structures and functions within TypeScript. 4 | > 5 | > Resulting code will have improved maintainability and better runtime type safety when done right. 6 | 7 | This is the backing repository for the article "Pattern Matching with TypeScript" published under https://alabor.me/2017/07/05/pattern-matching-with-typescript.html 8 | 9 | ## Examples 10 | 11 | The `examples/` directory contains example code which goes along with the article read. Every example is fully executable. 12 | 13 | You can run the examples by cloning or downloading this repository. Run `npm install` to install [TypeScript](https://www.typescriptlang.org/index.html) and [Jest](https://facebook.github.io/jest/). `npm test` executes the test suite for the examples. 14 | 15 | 😎 Pro tip: Run `npm test -- --watch` if you want to tinker with the code and rerun the test suite automatically. 16 | 17 | ## Article 18 | 19 | Github Pages is used to serve the article to you. You find its text and all assets in the `gh-pages` branch. 20 | 21 | ## Credits 22 | 23 | ❤️ Thanks to my reviewers for advises and proofreading: 24 | 25 | * [@dbrack](https://github.com/dbrack) 26 | * [@mweibel](https://github.com/mweibel) 27 | -------------------------------------------------------------------------------- /examples/00-switch/switch.test.ts: -------------------------------------------------------------------------------- 1 | import { matchNumber } from './switch'; 2 | 3 | describe('switch: matchNumber', () => { 4 | it('should match 0 with "0"', () => { 5 | expect(matchNumber(0)).toBe('0'); 6 | }); 7 | 8 | it('should match 1 with "one"', () => { 9 | expect(matchNumber(1)).toBe('one'); 10 | }); 11 | 12 | it('should match 2 with "two"', () => { 13 | expect(matchNumber(2)).toBe('two'); 14 | }); 15 | 16 | it('should match 3 with "two"', () => { 17 | expect(matchNumber(3)).toBe('three'); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /examples/00-switch/switch.ts: -------------------------------------------------------------------------------- 1 | export function matchNumber(n: number): string { 2 | switch (n) { 3 | case 1: 4 | return 'one'; 5 | case 2: 6 | return 'two'; 7 | case 3: 8 | return 'three'; 9 | default: 10 | return `${n}`; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /examples/01-separation-of-concerns/separation-of-concerns.test.ts: -------------------------------------------------------------------------------- 1 | import { matchNumber } from './separation-of-concerns'; 2 | const noop = () => ''; 3 | 4 | describe('Separation of Concerns: NumberPattern', () => { 5 | it('should match 0 with Other(0)', () => { 6 | const spy = jest.fn(); 7 | const match = matchNumber({ 8 | One: noop, 9 | Two: noop, 10 | Three: noop, 11 | Other: spy 12 | }); 13 | 14 | match(0); 15 | expect(spy).toHaveBeenCalledWith(0); 16 | }); 17 | 18 | it('should match 1 with One', () => { 19 | const spy = jest.fn(); 20 | const match = matchNumber({ 21 | One: spy, 22 | Two: noop, 23 | Three: noop, 24 | Other: noop 25 | }); 26 | 27 | match(1); 28 | expect(spy).toHaveBeenCalled(); 29 | }); 30 | 31 | it('should match 2 with Two', () => { 32 | const spy = jest.fn(); 33 | const match = matchNumber({ 34 | One: noop, 35 | Two: spy, 36 | Three: noop, 37 | Other: noop 38 | }); 39 | 40 | match(2); 41 | expect(spy).toHaveBeenCalled(); 42 | }); 43 | 44 | it('should match 3 with Three', () => { 45 | const spy = jest.fn(); 46 | const match = matchNumber({ 47 | One: noop, 48 | Two: noop, 49 | Three: spy, 50 | Other: noop 51 | }); 52 | 53 | match(3); 54 | expect(spy).toHaveBeenCalled(); 55 | }); 56 | }); 57 | -------------------------------------------------------------------------------- /examples/01-separation-of-concerns/separation-of-concerns.ts: -------------------------------------------------------------------------------- 1 | interface NumberPattern { 2 | One: () => string; 3 | Two: () => string; 4 | Three: () => string; 5 | Other: (n: number) => string; 6 | } 7 | 8 | export function matchNumber(p: NumberPattern): (n: number) => string { 9 | return (n: number): string => { 10 | switch (n) { 11 | case 1: 12 | return p.One(); 13 | case 2: 14 | return p.Two(); 15 | case 3: 16 | return p.Three(); 17 | default: 18 | return p.Other(n); 19 | } 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /examples/02-truly-reusable/truly-reusable.test.ts: -------------------------------------------------------------------------------- 1 | import { matchNumber } from './truly-reusable'; 2 | 3 | const isLargerThanThree = matchNumber({ 4 | One: () => false, 5 | Two: () => false, 6 | Three: () => false, 7 | Other: n => n > 3 8 | }); 9 | 10 | describe('Truly Reusable: NumberPattern', () => { 11 | it('should return false for 0', () => { 12 | expect(isLargerThanThree(0)).toBe(false); 13 | }); 14 | 15 | it('should return false for 1', () => { 16 | expect(isLargerThanThree(1)).toBe(false); 17 | }); 18 | 19 | it('should return true for 4', () => { 20 | expect(isLargerThanThree(4)).toBe(true); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /examples/02-truly-reusable/truly-reusable.ts: -------------------------------------------------------------------------------- 1 | interface NumberPattern { 2 | One: () => T; 3 | Two: () => T; 4 | Three: () => T; 5 | Other: (n: number) => T; 6 | } 7 | 8 | export function matchNumber(p: NumberPattern): (n: number) => T { 9 | return (n: number): T => { 10 | switch (n) { 11 | case 1: 12 | return p.One(); 13 | case 2: 14 | return p.Two(); 15 | case 3: 16 | return p.Three(); 17 | default: 18 | return p.Other(n); 19 | } 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /examples/03-union-types/__snapshots__/union-types.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Union Types: ArgumentPattern should throw an error when trying to match undefined 1`] = `"matchArgument: Could not match type undefined"`; 4 | -------------------------------------------------------------------------------- /examples/03-union-types/union-types.test.ts: -------------------------------------------------------------------------------- 1 | import { Argument, matchArgument } from './union-types'; 2 | 3 | describe('Union Types: ArgumentPattern', () => { 4 | it('should match a string with String(string)', () => { 5 | const argument: Argument = 'Hello World.'; 6 | const stringSpy = jest.fn(); 7 | const booleanSpy = jest.fn(); 8 | const numberSpy = jest.fn(); 9 | 10 | matchArgument({ 11 | String: stringSpy, 12 | Boolean: booleanSpy, 13 | Number: numberSpy 14 | })(argument); 15 | 16 | expect(stringSpy).toHaveBeenCalledWith(argument); 17 | expect(booleanSpy).not.toHaveBeenCalled(); 18 | expect(numberSpy).not.toHaveBeenCalled(); 19 | }); 20 | 21 | it('should match a boolean with Boolean(boolean)', () => { 22 | const argument: Argument = true; 23 | const stringSpy = jest.fn(); 24 | const booleanSpy = jest.fn(); 25 | const numberSpy = jest.fn(); 26 | 27 | matchArgument({ 28 | String: stringSpy, 29 | Boolean: booleanSpy, 30 | Number: numberSpy 31 | })(argument); 32 | 33 | expect(stringSpy).not.toHaveBeenCalled(); 34 | expect(booleanSpy).toHaveBeenCalledWith(argument); 35 | expect(numberSpy).not.toHaveBeenCalled(); 36 | }); 37 | 38 | it('should match null with Null()', () => { 39 | const argument: Argument = 42; 40 | const stringSpy = jest.fn(); 41 | const booleanSpy = jest.fn(); 42 | const numberSpy = jest.fn(); 43 | 44 | matchArgument({ 45 | String: stringSpy, 46 | Boolean: booleanSpy, 47 | Number: numberSpy 48 | })(argument); 49 | 50 | expect(stringSpy).not.toHaveBeenCalled(); 51 | expect(booleanSpy).not.toHaveBeenCalled(); 52 | expect(numberSpy).toHaveBeenCalledWith(argument); 53 | }); 54 | 55 | it('should throw an error when trying to match undefined', () => { 56 | const argument: Argument = undefined; 57 | const stringSpy = jest.fn(); 58 | const booleanSpy = jest.fn(); 59 | const numberSpy = jest.fn(); 60 | 61 | expect(() => { 62 | matchArgument({ 63 | String: stringSpy, 64 | Boolean: booleanSpy, 65 | Number: numberSpy 66 | })(argument); 67 | }).toThrowErrorMatchingSnapshot(); 68 | }); 69 | }); 70 | -------------------------------------------------------------------------------- /examples/03-union-types/union-types.ts: -------------------------------------------------------------------------------- 1 | export type Argument = string | boolean | number; 2 | 3 | interface ArgumentPattern { 4 | String: (s: string) => T; 5 | Boolean: (b: boolean) => T; 6 | Number: (n: number) => T; 7 | } 8 | 9 | export function matchArgument(p: ArgumentPattern): (a: Argument) => T { 10 | return (a: Argument): T => { 11 | if (typeof a === 'string') { 12 | return p.String(a); 13 | } else if (typeof a === 'boolean') { 14 | return p.Boolean(a); 15 | } else if (typeof a === 'number') { 16 | return p.Number(a); 17 | } 18 | 19 | throw new Error(`matchArgument: Could not match type ${typeof a}`); 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /examples/04-real-life-problem-domain/real-life-problem-domain.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | calculatePaymentAmount, 3 | CashPayment, 4 | CreditCardPayment, 5 | Payment 6 | } from './real-life-problem-domain'; 7 | 8 | const creditCardPayment = new CreditCardPayment(100, 0.02); 9 | const cashPayment = new CashPayment(100, 42); 10 | 11 | describe('Real Life Problem Domain:', () => { 12 | describe('PaymentPattern', () => { 13 | it('should match a CreditCardPayment with CreditCard(card)', () => { 14 | const cardSpy = jest.fn(); 15 | const cashSpy = jest.fn(); 16 | 17 | creditCardPayment.match({ 18 | CreditCard: cardSpy, 19 | Cash: cashSpy 20 | }); 21 | 22 | expect(cardSpy).toHaveBeenCalledWith(creditCardPayment); 23 | expect(cashSpy).not.toHaveBeenCalled(); 24 | }); 25 | 26 | it('should match a CashPayment with Cash(cash)', () => { 27 | const cardSpy = jest.fn(); 28 | const cashSpy = jest.fn(); 29 | 30 | cashPayment.match({ 31 | CreditCard: cardSpy, 32 | Cash: cashSpy 33 | }); 34 | 35 | expect(cardSpy).not.toHaveBeenCalled(); 36 | expect(cashSpy).toHaveBeenCalledWith(cashPayment); 37 | }); 38 | }); 39 | 40 | describe('calculatePaymentAmount()', () => { 41 | it('should add fees multiplied with amount to amount for credit card payments', () => { 42 | const finalAmount = 43 | creditCardPayment.amount + 44 | creditCardPayment.amount * creditCardPayment.fee; 45 | expect(calculatePaymentAmount(creditCardPayment)).toEqual(finalAmount); 46 | }); 47 | 48 | it('should subtract discount from amount for cash payments', () => { 49 | const finalAmount = cashPayment.amount - cashPayment.discount; 50 | expect(calculatePaymentAmount(cashPayment)).toEqual(finalAmount); 51 | }); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /examples/04-real-life-problem-domain/real-life-problem-domain.ts: -------------------------------------------------------------------------------- 1 | interface PaymentPattern { 2 | CreditCard: (card: CreditCardPayment) => T; 3 | Cash: (cash: CashPayment) => T; 4 | } 5 | 6 | interface PaymentMatcher { 7 | match(p: PaymentPattern): T; 8 | } 9 | 10 | export abstract class Payment implements PaymentMatcher { 11 | constructor(public readonly amount: number) {} 12 | abstract match(p: PaymentPattern): T; 13 | } 14 | 15 | export class CreditCardPayment extends Payment { 16 | constructor(amount: number, public readonly fee: number) { 17 | super(amount); 18 | } 19 | 20 | match(p: PaymentPattern): T { 21 | return p.CreditCard(this); 22 | } 23 | } 24 | 25 | export class CashPayment extends Payment { 26 | constructor(amount: number, public readonly discount: number) { 27 | super(amount); 28 | } 29 | 30 | match(p: PaymentPattern): T { 31 | return p.Cash(this); 32 | } 33 | } 34 | 35 | export function calculatePaymentAmount(payment: Payment) { 36 | return payment.match({ 37 | CreditCard: card => card.amount + card.amount * card.fee, 38 | Cash: cash => cash.amount - cash.discount 39 | }); 40 | } 41 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pattern-matching-with-typescript", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@types/jest": { 7 | "version": "19.2.4", 8 | "resolved": "https://registry.npmjs.org/@types/jest/-/jest-19.2.4.tgz", 9 | "integrity": "sha512-w9nmNHHkl9lNeOorjz1a7BLUd6zTa3pakNx2qkKCVtYS44L7taPcJB8l1kQWVOIa7kN08qwlyS11A1nz2yUvWQ==" 10 | }, 11 | "abab": { 12 | "version": "1.0.3", 13 | "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.3.tgz", 14 | "integrity": "sha1-uB3l9ydOxOdW15fNg08wNkJyTl0=" 15 | }, 16 | "acorn": { 17 | "version": "4.0.13", 18 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 19 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" 20 | }, 21 | "acorn-globals": { 22 | "version": "3.1.0", 23 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", 24 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=" 25 | }, 26 | "ajv": { 27 | "version": "4.11.8", 28 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 29 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" 30 | }, 31 | "align-text": { 32 | "version": "0.1.4", 33 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 34 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=" 35 | }, 36 | "amdefine": { 37 | "version": "1.0.1", 38 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 39 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 40 | }, 41 | "ansi-escapes": { 42 | "version": "1.4.0", 43 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 44 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" 45 | }, 46 | "ansi-regex": { 47 | "version": "2.1.1", 48 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 49 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 50 | }, 51 | "ansi-styles": { 52 | "version": "2.2.1", 53 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 54 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 55 | }, 56 | "anymatch": { 57 | "version": "1.3.0", 58 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", 59 | "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=" 60 | }, 61 | "append-transform": { 62 | "version": "0.4.0", 63 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", 64 | "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=" 65 | }, 66 | "argparse": { 67 | "version": "1.0.9", 68 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 69 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=" 70 | }, 71 | "arr-diff": { 72 | "version": "2.0.0", 73 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 74 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=" 75 | }, 76 | "arr-flatten": { 77 | "version": "1.0.3", 78 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", 79 | "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=" 80 | }, 81 | "array-equal": { 82 | "version": "1.0.0", 83 | "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", 84 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 85 | }, 86 | "array-unique": { 87 | "version": "0.2.1", 88 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 89 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" 90 | }, 91 | "arrify": { 92 | "version": "1.0.1", 93 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 94 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 95 | }, 96 | "asn1": { 97 | "version": "0.2.3", 98 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 99 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 100 | }, 101 | "assert-plus": { 102 | "version": "0.2.0", 103 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 104 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 105 | }, 106 | "async": { 107 | "version": "2.4.1", 108 | "resolved": "https://registry.npmjs.org/async/-/async-2.4.1.tgz", 109 | "integrity": "sha1-YqVrJ5yYoR0JhwlqAcw+6463u9c=" 110 | }, 111 | "asynckit": { 112 | "version": "0.4.0", 113 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 114 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 115 | }, 116 | "aws-sign2": { 117 | "version": "0.6.0", 118 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 119 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 120 | }, 121 | "aws4": { 122 | "version": "1.6.0", 123 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 124 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 125 | }, 126 | "babel-code-frame": { 127 | "version": "6.22.0", 128 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", 129 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=" 130 | }, 131 | "babel-core": { 132 | "version": "6.24.1", 133 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz", 134 | "integrity": "sha1-jEKFZNzh4fQfszfsNPTDsCK1rYM=" 135 | }, 136 | "babel-generator": { 137 | "version": "6.24.1", 138 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz", 139 | "integrity": "sha1-5xX0hsWN7SVknYiJRNUqoHxdlJc=" 140 | }, 141 | "babel-helpers": { 142 | "version": "6.24.1", 143 | "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", 144 | "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" 145 | }, 146 | "babel-jest": { 147 | "version": "20.0.3", 148 | "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", 149 | "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=" 150 | }, 151 | "babel-messages": { 152 | "version": "6.23.0", 153 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", 154 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" 155 | }, 156 | "babel-plugin-istanbul": { 157 | "version": "4.1.4", 158 | "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.4.tgz", 159 | "integrity": "sha1-GN3oS/POMp/d8/QQP66SFFbY5Yc=" 160 | }, 161 | "babel-plugin-jest-hoist": { 162 | "version": "20.0.3", 163 | "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz", 164 | "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c=" 165 | }, 166 | "babel-preset-jest": { 167 | "version": "20.0.3", 168 | "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", 169 | "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=" 170 | }, 171 | "babel-register": { 172 | "version": "6.24.1", 173 | "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", 174 | "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=" 175 | }, 176 | "babel-runtime": { 177 | "version": "6.23.0", 178 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", 179 | "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=" 180 | }, 181 | "babel-template": { 182 | "version": "6.24.1", 183 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz", 184 | "integrity": "sha1-BK5RTx+Ts6JTfyoPYKWkX7gwgzM=" 185 | }, 186 | "babel-traverse": { 187 | "version": "6.24.1", 188 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz", 189 | "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=" 190 | }, 191 | "babel-types": { 192 | "version": "6.24.1", 193 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz", 194 | "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=" 195 | }, 196 | "babylon": { 197 | "version": "6.17.2", 198 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.2.tgz", 199 | "integrity": "sha1-IB0l71+JLEG65JSIsI2w3Udun1w=" 200 | }, 201 | "balanced-match": { 202 | "version": "0.4.2", 203 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", 204 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" 205 | }, 206 | "bcrypt-pbkdf": { 207 | "version": "1.0.1", 208 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 209 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 210 | "optional": true 211 | }, 212 | "boom": { 213 | "version": "2.10.1", 214 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 215 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" 216 | }, 217 | "brace-expansion": { 218 | "version": "1.1.7", 219 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", 220 | "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=" 221 | }, 222 | "braces": { 223 | "version": "1.8.5", 224 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 225 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=" 226 | }, 227 | "browser-resolve": { 228 | "version": "1.11.2", 229 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", 230 | "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", 231 | "dependencies": { 232 | "resolve": { 233 | "version": "1.1.7", 234 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 235 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" 236 | } 237 | } 238 | }, 239 | "bser": { 240 | "version": "2.0.0", 241 | "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", 242 | "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=" 243 | }, 244 | "builtin-modules": { 245 | "version": "1.1.1", 246 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 247 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 248 | }, 249 | "callsites": { 250 | "version": "2.0.0", 251 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", 252 | "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" 253 | }, 254 | "camelcase": { 255 | "version": "1.2.1", 256 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 257 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 258 | "optional": true 259 | }, 260 | "caseless": { 261 | "version": "0.12.0", 262 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 263 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 264 | }, 265 | "center-align": { 266 | "version": "0.1.3", 267 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 268 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 269 | "optional": true 270 | }, 271 | "chalk": { 272 | "version": "1.1.3", 273 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 274 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" 275 | }, 276 | "ci-info": { 277 | "version": "1.0.0", 278 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", 279 | "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=" 280 | }, 281 | "cliui": { 282 | "version": "2.1.0", 283 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 284 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 285 | "optional": true, 286 | "dependencies": { 287 | "wordwrap": { 288 | "version": "0.0.2", 289 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 290 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 291 | "optional": true 292 | } 293 | } 294 | }, 295 | "co": { 296 | "version": "4.6.0", 297 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 298 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 299 | }, 300 | "code-point-at": { 301 | "version": "1.1.0", 302 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 303 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 304 | }, 305 | "color-convert": { 306 | "version": "1.9.0", 307 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", 308 | "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=" 309 | }, 310 | "color-name": { 311 | "version": "1.1.2", 312 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz", 313 | "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=" 314 | }, 315 | "combined-stream": { 316 | "version": "1.0.5", 317 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 318 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" 319 | }, 320 | "concat-map": { 321 | "version": "0.0.1", 322 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 323 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 324 | }, 325 | "content-type-parser": { 326 | "version": "1.0.1", 327 | "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", 328 | "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=" 329 | }, 330 | "convert-source-map": { 331 | "version": "1.5.0", 332 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", 333 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" 334 | }, 335 | "core-js": { 336 | "version": "2.4.1", 337 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", 338 | "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" 339 | }, 340 | "cryptiles": { 341 | "version": "2.0.5", 342 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 343 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" 344 | }, 345 | "cssom": { 346 | "version": "0.3.2", 347 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", 348 | "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=" 349 | }, 350 | "cssstyle": { 351 | "version": "0.2.37", 352 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", 353 | "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=" 354 | }, 355 | "dashdash": { 356 | "version": "1.14.1", 357 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 358 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 359 | "dependencies": { 360 | "assert-plus": { 361 | "version": "1.0.0", 362 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 363 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 364 | } 365 | } 366 | }, 367 | "debug": { 368 | "version": "2.6.8", 369 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 370 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" 371 | }, 372 | "decamelize": { 373 | "version": "1.2.0", 374 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 375 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 376 | }, 377 | "deep-is": { 378 | "version": "0.1.3", 379 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 380 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 381 | }, 382 | "default-require-extensions": { 383 | "version": "1.0.0", 384 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", 385 | "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=" 386 | }, 387 | "delayed-stream": { 388 | "version": "1.0.0", 389 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 390 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 391 | }, 392 | "detect-indent": { 393 | "version": "4.0.0", 394 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", 395 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" 396 | }, 397 | "diff": { 398 | "version": "3.2.0", 399 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", 400 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" 401 | }, 402 | "double-ended-queue": { 403 | "version": "2.1.0-0", 404 | "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", 405 | "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" 406 | }, 407 | "ecc-jsbn": { 408 | "version": "0.1.1", 409 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 410 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 411 | "optional": true 412 | }, 413 | "errno": { 414 | "version": "0.1.4", 415 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", 416 | "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=" 417 | }, 418 | "error-ex": { 419 | "version": "1.3.1", 420 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 421 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" 422 | }, 423 | "escape-string-regexp": { 424 | "version": "1.0.5", 425 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 426 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 427 | }, 428 | "escodegen": { 429 | "version": "1.8.1", 430 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 431 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 432 | "dependencies": { 433 | "esprima": { 434 | "version": "2.7.3", 435 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 436 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" 437 | }, 438 | "source-map": { 439 | "version": "0.2.0", 440 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 441 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 442 | "optional": true 443 | } 444 | } 445 | }, 446 | "esprima": { 447 | "version": "3.1.3", 448 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 449 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 450 | }, 451 | "estraverse": { 452 | "version": "1.9.3", 453 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 454 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" 455 | }, 456 | "esutils": { 457 | "version": "2.0.2", 458 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 459 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 460 | }, 461 | "exec-sh": { 462 | "version": "0.2.0", 463 | "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.0.tgz", 464 | "integrity": "sha1-FPdd4/INKG75MwmbLOUKkDWc7xA=" 465 | }, 466 | "expand-brackets": { 467 | "version": "0.1.5", 468 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 469 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=" 470 | }, 471 | "expand-range": { 472 | "version": "1.8.2", 473 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 474 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=" 475 | }, 476 | "extend": { 477 | "version": "3.0.1", 478 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 479 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 480 | }, 481 | "extglob": { 482 | "version": "0.3.2", 483 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 484 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=" 485 | }, 486 | "extsprintf": { 487 | "version": "1.0.2", 488 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", 489 | "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" 490 | }, 491 | "fast-levenshtein": { 492 | "version": "2.0.6", 493 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 494 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 495 | }, 496 | "fb-watchman": { 497 | "version": "2.0.0", 498 | "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", 499 | "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=" 500 | }, 501 | "filename-regex": { 502 | "version": "2.0.1", 503 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 504 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" 505 | }, 506 | "fileset": { 507 | "version": "2.0.3", 508 | "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", 509 | "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=" 510 | }, 511 | "fill-range": { 512 | "version": "2.2.3", 513 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 514 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=" 515 | }, 516 | "find-up": { 517 | "version": "2.1.0", 518 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 519 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" 520 | }, 521 | "for-in": { 522 | "version": "1.0.2", 523 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 524 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 525 | }, 526 | "for-own": { 527 | "version": "0.1.5", 528 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 529 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=" 530 | }, 531 | "forever-agent": { 532 | "version": "0.6.1", 533 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 534 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 535 | }, 536 | "form-data": { 537 | "version": "2.1.4", 538 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 539 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" 540 | }, 541 | "fs.realpath": { 542 | "version": "1.0.0", 543 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 544 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 545 | }, 546 | "get-caller-file": { 547 | "version": "1.0.2", 548 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", 549 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" 550 | }, 551 | "getpass": { 552 | "version": "0.1.7", 553 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 554 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 555 | "dependencies": { 556 | "assert-plus": { 557 | "version": "1.0.0", 558 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 559 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 560 | } 561 | } 562 | }, 563 | "glob": { 564 | "version": "7.1.2", 565 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 566 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" 567 | }, 568 | "glob-base": { 569 | "version": "0.3.0", 570 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 571 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=" 572 | }, 573 | "glob-parent": { 574 | "version": "2.0.0", 575 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 576 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=" 577 | }, 578 | "globals": { 579 | "version": "9.18.0", 580 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 581 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" 582 | }, 583 | "graceful-fs": { 584 | "version": "4.1.11", 585 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 586 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 587 | }, 588 | "growly": { 589 | "version": "1.3.0", 590 | "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", 591 | "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" 592 | }, 593 | "handlebars": { 594 | "version": "4.0.10", 595 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", 596 | "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", 597 | "dependencies": { 598 | "async": { 599 | "version": "1.5.2", 600 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 601 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 602 | }, 603 | "source-map": { 604 | "version": "0.4.4", 605 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 606 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=" 607 | } 608 | } 609 | }, 610 | "har-schema": { 611 | "version": "1.0.5", 612 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 613 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" 614 | }, 615 | "har-validator": { 616 | "version": "4.2.1", 617 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 618 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" 619 | }, 620 | "has-ansi": { 621 | "version": "2.0.0", 622 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 623 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" 624 | }, 625 | "has-flag": { 626 | "version": "1.0.0", 627 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 628 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" 629 | }, 630 | "hawk": { 631 | "version": "3.1.3", 632 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 633 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" 634 | }, 635 | "hoek": { 636 | "version": "2.16.3", 637 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 638 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 639 | }, 640 | "home-or-tmp": { 641 | "version": "2.0.0", 642 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", 643 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" 644 | }, 645 | "hosted-git-info": { 646 | "version": "2.4.2", 647 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", 648 | "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" 649 | }, 650 | "html-encoding-sniffer": { 651 | "version": "1.0.1", 652 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", 653 | "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=" 654 | }, 655 | "http-signature": { 656 | "version": "1.1.1", 657 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 658 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" 659 | }, 660 | "iconv-lite": { 661 | "version": "0.4.13", 662 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", 663 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" 664 | }, 665 | "inflight": { 666 | "version": "1.0.6", 667 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 668 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 669 | }, 670 | "inherits": { 671 | "version": "2.0.3", 672 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 673 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 674 | }, 675 | "invariant": { 676 | "version": "2.2.2", 677 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", 678 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=" 679 | }, 680 | "invert-kv": { 681 | "version": "1.0.0", 682 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 683 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 684 | }, 685 | "is-arrayish": { 686 | "version": "0.2.1", 687 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 688 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 689 | }, 690 | "is-buffer": { 691 | "version": "1.1.5", 692 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 693 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" 694 | }, 695 | "is-builtin-module": { 696 | "version": "1.0.0", 697 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 698 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" 699 | }, 700 | "is-ci": { 701 | "version": "1.0.10", 702 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", 703 | "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=" 704 | }, 705 | "is-dotfile": { 706 | "version": "1.0.3", 707 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", 708 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" 709 | }, 710 | "is-equal-shallow": { 711 | "version": "0.1.3", 712 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 713 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=" 714 | }, 715 | "is-extendable": { 716 | "version": "0.1.1", 717 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 718 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 719 | }, 720 | "is-extglob": { 721 | "version": "1.0.0", 722 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 723 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" 724 | }, 725 | "is-finite": { 726 | "version": "1.0.2", 727 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 728 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" 729 | }, 730 | "is-fullwidth-code-point": { 731 | "version": "1.0.0", 732 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 733 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" 734 | }, 735 | "is-glob": { 736 | "version": "2.0.1", 737 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 738 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=" 739 | }, 740 | "is-number": { 741 | "version": "2.1.0", 742 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 743 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=" 744 | }, 745 | "is-posix-bracket": { 746 | "version": "0.1.1", 747 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 748 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" 749 | }, 750 | "is-primitive": { 751 | "version": "2.0.0", 752 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 753 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" 754 | }, 755 | "is-typedarray": { 756 | "version": "1.0.0", 757 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 758 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 759 | }, 760 | "is-utf8": { 761 | "version": "0.2.1", 762 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 763 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 764 | }, 765 | "isarray": { 766 | "version": "1.0.0", 767 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 768 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 769 | }, 770 | "isexe": { 771 | "version": "2.0.0", 772 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 773 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 774 | }, 775 | "isobject": { 776 | "version": "2.1.0", 777 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 778 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" 779 | }, 780 | "isstream": { 781 | "version": "0.1.2", 782 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 783 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 784 | }, 785 | "istanbul-api": { 786 | "version": "1.1.9", 787 | "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.9.tgz", 788 | "integrity": "sha512-zV14oa+hjBNP3gJTM/BzNdJpInHKbZ9cLIEwVasuaTUA1ebF9TBOIfcC5SDAE3C11rXxOw3KSimKGMiFz6PpWQ==" 789 | }, 790 | "istanbul-lib-coverage": { 791 | "version": "1.1.1", 792 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", 793 | "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==" 794 | }, 795 | "istanbul-lib-hook": { 796 | "version": "1.0.7", 797 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", 798 | "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==" 799 | }, 800 | "istanbul-lib-instrument": { 801 | "version": "1.7.2", 802 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz", 803 | "integrity": "sha512-lPgUY+Pa5dlq2/l0qs1PJZ54QPSfo+s4+UZdkb2d0hbOyrEIAbUJphBLFjEyXBdeCONgGRADFzs3ojfFtmuwFA==" 804 | }, 805 | "istanbul-lib-report": { 806 | "version": "1.1.1", 807 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", 808 | "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", 809 | "dependencies": { 810 | "supports-color": { 811 | "version": "3.2.3", 812 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 813 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=" 814 | } 815 | } 816 | }, 817 | "istanbul-lib-source-maps": { 818 | "version": "1.2.1", 819 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", 820 | "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==" 821 | }, 822 | "istanbul-reports": { 823 | "version": "1.1.1", 824 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", 825 | "integrity": "sha512-P8G873A0kW24XRlxHVGhMJBhQ8gWAec+dae7ZxOBzxT4w+a9ATSPvRVK3LB1RAJ9S8bg2tOyWHAGW40Zd2dKfw==" 826 | }, 827 | "jest": { 828 | "version": "20.0.4", 829 | "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", 830 | "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", 831 | "dependencies": { 832 | "jest-cli": { 833 | "version": "20.0.4", 834 | "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", 835 | "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=" 836 | } 837 | } 838 | }, 839 | "jest-changed-files": { 840 | "version": "20.0.3", 841 | "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-20.0.3.tgz", 842 | "integrity": "sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=" 843 | }, 844 | "jest-config": { 845 | "version": "20.0.4", 846 | "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", 847 | "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=" 848 | }, 849 | "jest-diff": { 850 | "version": "20.0.3", 851 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", 852 | "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=" 853 | }, 854 | "jest-docblock": { 855 | "version": "20.0.3", 856 | "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", 857 | "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=" 858 | }, 859 | "jest-environment-jsdom": { 860 | "version": "20.0.3", 861 | "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", 862 | "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=" 863 | }, 864 | "jest-environment-node": { 865 | "version": "20.0.3", 866 | "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", 867 | "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=" 868 | }, 869 | "jest-haste-map": { 870 | "version": "20.0.4", 871 | "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.4.tgz", 872 | "integrity": "sha1-ZT61XIic48Ah97lGk/IKQVm63wM=" 873 | }, 874 | "jest-jasmine2": { 875 | "version": "20.0.4", 876 | "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", 877 | "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=" 878 | }, 879 | "jest-matcher-utils": { 880 | "version": "20.0.3", 881 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", 882 | "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=" 883 | }, 884 | "jest-matchers": { 885 | "version": "20.0.3", 886 | "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", 887 | "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=" 888 | }, 889 | "jest-message-util": { 890 | "version": "20.0.3", 891 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", 892 | "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=" 893 | }, 894 | "jest-mock": { 895 | "version": "20.0.3", 896 | "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-20.0.3.tgz", 897 | "integrity": "sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=" 898 | }, 899 | "jest-regex-util": { 900 | "version": "20.0.3", 901 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-20.0.3.tgz", 902 | "integrity": "sha1-hburXRM+RGJbGfr4xqpRItCF12I=" 903 | }, 904 | "jest-resolve": { 905 | "version": "20.0.4", 906 | "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", 907 | "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=" 908 | }, 909 | "jest-resolve-dependencies": { 910 | "version": "20.0.3", 911 | "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", 912 | "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=" 913 | }, 914 | "jest-runtime": { 915 | "version": "20.0.4", 916 | "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", 917 | "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", 918 | "dependencies": { 919 | "strip-bom": { 920 | "version": "3.0.0", 921 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 922 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" 923 | } 924 | } 925 | }, 926 | "jest-snapshot": { 927 | "version": "20.0.3", 928 | "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", 929 | "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=" 930 | }, 931 | "jest-util": { 932 | "version": "20.0.3", 933 | "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", 934 | "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=" 935 | }, 936 | "jest-validate": { 937 | "version": "20.0.3", 938 | "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", 939 | "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=" 940 | }, 941 | "jodid25519": { 942 | "version": "1.0.2", 943 | "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", 944 | "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", 945 | "optional": true 946 | }, 947 | "js-tokens": { 948 | "version": "3.0.1", 949 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", 950 | "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=" 951 | }, 952 | "js-yaml": { 953 | "version": "3.8.4", 954 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", 955 | "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=" 956 | }, 957 | "jsbn": { 958 | "version": "0.1.1", 959 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 960 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 961 | "optional": true 962 | }, 963 | "jsdom": { 964 | "version": "9.12.0", 965 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", 966 | "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=" 967 | }, 968 | "jsesc": { 969 | "version": "1.3.0", 970 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 971 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" 972 | }, 973 | "json-schema": { 974 | "version": "0.2.3", 975 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 976 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 977 | }, 978 | "json-stable-stringify": { 979 | "version": "1.0.1", 980 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 981 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" 982 | }, 983 | "json-stringify-safe": { 984 | "version": "5.0.1", 985 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 986 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 987 | }, 988 | "json5": { 989 | "version": "0.5.1", 990 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 991 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" 992 | }, 993 | "jsonify": { 994 | "version": "0.0.0", 995 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 996 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 997 | }, 998 | "jsprim": { 999 | "version": "1.4.0", 1000 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", 1001 | "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", 1002 | "dependencies": { 1003 | "assert-plus": { 1004 | "version": "1.0.0", 1005 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1006 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 1007 | } 1008 | } 1009 | }, 1010 | "kind-of": { 1011 | "version": "3.2.2", 1012 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1013 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" 1014 | }, 1015 | "lazy-cache": { 1016 | "version": "1.0.4", 1017 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1018 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1019 | "optional": true 1020 | }, 1021 | "lcid": { 1022 | "version": "1.0.0", 1023 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1024 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" 1025 | }, 1026 | "leven": { 1027 | "version": "2.1.0", 1028 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 1029 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" 1030 | }, 1031 | "levn": { 1032 | "version": "0.3.0", 1033 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1034 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=" 1035 | }, 1036 | "load-json-file": { 1037 | "version": "1.1.0", 1038 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1039 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" 1040 | }, 1041 | "locate-path": { 1042 | "version": "2.0.0", 1043 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1044 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" 1045 | }, 1046 | "lodash": { 1047 | "version": "4.17.4", 1048 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1049 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 1050 | }, 1051 | "longest": { 1052 | "version": "1.0.1", 1053 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1054 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 1055 | }, 1056 | "loose-envify": { 1057 | "version": "1.3.1", 1058 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 1059 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" 1060 | }, 1061 | "makeerror": { 1062 | "version": "1.0.11", 1063 | "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", 1064 | "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=" 1065 | }, 1066 | "merge": { 1067 | "version": "1.2.0", 1068 | "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", 1069 | "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" 1070 | }, 1071 | "micromatch": { 1072 | "version": "2.3.11", 1073 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1074 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=" 1075 | }, 1076 | "mime-db": { 1077 | "version": "1.27.0", 1078 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", 1079 | "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" 1080 | }, 1081 | "mime-types": { 1082 | "version": "2.1.15", 1083 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", 1084 | "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" 1085 | }, 1086 | "minimatch": { 1087 | "version": "3.0.4", 1088 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1089 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" 1090 | }, 1091 | "minimist": { 1092 | "version": "0.0.8", 1093 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1094 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1095 | }, 1096 | "mkdirp": { 1097 | "version": "0.5.1", 1098 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1099 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=" 1100 | }, 1101 | "ms": { 1102 | "version": "2.0.0", 1103 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1104 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1105 | }, 1106 | "natural-compare": { 1107 | "version": "1.4.0", 1108 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1109 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" 1110 | }, 1111 | "node-int64": { 1112 | "version": "0.4.0", 1113 | "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 1114 | "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" 1115 | }, 1116 | "node-notifier": { 1117 | "version": "5.1.2", 1118 | "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.1.2.tgz", 1119 | "integrity": "sha1-L6nhJgX6EACdRFSdb82KY93g5P8=" 1120 | }, 1121 | "normalize-package-data": { 1122 | "version": "2.3.8", 1123 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", 1124 | "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=" 1125 | }, 1126 | "normalize-path": { 1127 | "version": "2.1.1", 1128 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1129 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=" 1130 | }, 1131 | "number-is-nan": { 1132 | "version": "1.0.1", 1133 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1134 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1135 | }, 1136 | "nwmatcher": { 1137 | "version": "1.4.0", 1138 | "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.0.tgz", 1139 | "integrity": "sha1-tDiTYhcOfvl5jDx3FtgOvAEG/M8=" 1140 | }, 1141 | "oauth-sign": { 1142 | "version": "0.8.2", 1143 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1144 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1145 | }, 1146 | "object-assign": { 1147 | "version": "4.1.1", 1148 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1149 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1150 | }, 1151 | "object.omit": { 1152 | "version": "2.0.1", 1153 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1154 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=" 1155 | }, 1156 | "once": { 1157 | "version": "1.4.0", 1158 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1159 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 1160 | }, 1161 | "optimist": { 1162 | "version": "0.6.1", 1163 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1164 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=" 1165 | }, 1166 | "optionator": { 1167 | "version": "0.8.2", 1168 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1169 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1170 | "dependencies": { 1171 | "wordwrap": { 1172 | "version": "1.0.0", 1173 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1174 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1175 | } 1176 | } 1177 | }, 1178 | "os-homedir": { 1179 | "version": "1.0.2", 1180 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1181 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 1182 | }, 1183 | "os-locale": { 1184 | "version": "1.4.0", 1185 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1186 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=" 1187 | }, 1188 | "os-tmpdir": { 1189 | "version": "1.0.2", 1190 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1191 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1192 | }, 1193 | "p-limit": { 1194 | "version": "1.1.0", 1195 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", 1196 | "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" 1197 | }, 1198 | "p-locate": { 1199 | "version": "2.0.0", 1200 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1201 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" 1202 | }, 1203 | "p-map": { 1204 | "version": "1.1.1", 1205 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", 1206 | "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=" 1207 | }, 1208 | "parse-glob": { 1209 | "version": "3.0.4", 1210 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1211 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=" 1212 | }, 1213 | "parse-json": { 1214 | "version": "2.2.0", 1215 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1216 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" 1217 | }, 1218 | "parse5": { 1219 | "version": "1.5.1", 1220 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", 1221 | "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" 1222 | }, 1223 | "path-exists": { 1224 | "version": "3.0.0", 1225 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1226 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1227 | }, 1228 | "path-is-absolute": { 1229 | "version": "1.0.1", 1230 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1231 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1232 | }, 1233 | "path-parse": { 1234 | "version": "1.0.5", 1235 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1236 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" 1237 | }, 1238 | "path-type": { 1239 | "version": "1.1.0", 1240 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1241 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" 1242 | }, 1243 | "performance-now": { 1244 | "version": "0.2.0", 1245 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 1246 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" 1247 | }, 1248 | "pify": { 1249 | "version": "2.3.0", 1250 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1251 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 1252 | }, 1253 | "pinkie": { 1254 | "version": "2.0.4", 1255 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1256 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1257 | }, 1258 | "pinkie-promise": { 1259 | "version": "2.0.1", 1260 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1261 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" 1262 | }, 1263 | "prelude-ls": { 1264 | "version": "1.1.2", 1265 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1266 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 1267 | }, 1268 | "preserve": { 1269 | "version": "0.2.0", 1270 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1271 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" 1272 | }, 1273 | "prettier": { 1274 | "version": "1.4.2", 1275 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.4.2.tgz", 1276 | "integrity": "sha512-iJ8HPTHA/Amt9FDLrSRBWG+IWZo6Z4MJ/2oxJP4Rz6UWQUr4rM3MWYeFi6tG4d9kYGuvbnnZ/KYCGdTQ8sPubw==" 1277 | }, 1278 | "pretty-format": { 1279 | "version": "20.0.3", 1280 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", 1281 | "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", 1282 | "dependencies": { 1283 | "ansi-styles": { 1284 | "version": "3.0.0", 1285 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.0.0.tgz", 1286 | "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=" 1287 | } 1288 | } 1289 | }, 1290 | "private": { 1291 | "version": "0.1.7", 1292 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", 1293 | "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" 1294 | }, 1295 | "prr": { 1296 | "version": "0.0.0", 1297 | "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", 1298 | "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" 1299 | }, 1300 | "punycode": { 1301 | "version": "1.4.1", 1302 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1303 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1304 | }, 1305 | "qs": { 1306 | "version": "6.4.0", 1307 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 1308 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 1309 | }, 1310 | "randomatic": { 1311 | "version": "1.1.6", 1312 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", 1313 | "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=" 1314 | }, 1315 | "read-pkg": { 1316 | "version": "1.1.0", 1317 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 1318 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" 1319 | }, 1320 | "read-pkg-up": { 1321 | "version": "1.0.1", 1322 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 1323 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 1324 | "dependencies": { 1325 | "find-up": { 1326 | "version": "1.1.2", 1327 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 1328 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" 1329 | }, 1330 | "path-exists": { 1331 | "version": "2.1.0", 1332 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1333 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" 1334 | } 1335 | } 1336 | }, 1337 | "regenerator-runtime": { 1338 | "version": "0.10.5", 1339 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", 1340 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" 1341 | }, 1342 | "regex-cache": { 1343 | "version": "0.4.3", 1344 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", 1345 | "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=" 1346 | }, 1347 | "remove-trailing-separator": { 1348 | "version": "1.0.2", 1349 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", 1350 | "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" 1351 | }, 1352 | "repeat-element": { 1353 | "version": "1.1.2", 1354 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1355 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" 1356 | }, 1357 | "repeat-string": { 1358 | "version": "1.6.1", 1359 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1360 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 1361 | }, 1362 | "repeating": { 1363 | "version": "2.0.1", 1364 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1365 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" 1366 | }, 1367 | "request": { 1368 | "version": "2.81.0", 1369 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 1370 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=" 1371 | }, 1372 | "require-directory": { 1373 | "version": "2.1.1", 1374 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1375 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1376 | }, 1377 | "require-main-filename": { 1378 | "version": "1.0.1", 1379 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1380 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 1381 | }, 1382 | "resolve": { 1383 | "version": "1.3.3", 1384 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", 1385 | "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=" 1386 | }, 1387 | "right-align": { 1388 | "version": "0.1.3", 1389 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1390 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1391 | "optional": true 1392 | }, 1393 | "rimraf": { 1394 | "version": "2.6.1", 1395 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", 1396 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=" 1397 | }, 1398 | "safe-buffer": { 1399 | "version": "5.1.0", 1400 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", 1401 | "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==" 1402 | }, 1403 | "sane": { 1404 | "version": "1.6.0", 1405 | "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", 1406 | "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", 1407 | "dependencies": { 1408 | "bser": { 1409 | "version": "1.0.2", 1410 | "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", 1411 | "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=" 1412 | }, 1413 | "fb-watchman": { 1414 | "version": "1.9.2", 1415 | "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", 1416 | "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=" 1417 | }, 1418 | "minimist": { 1419 | "version": "1.2.0", 1420 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1421 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1422 | } 1423 | } 1424 | }, 1425 | "sax": { 1426 | "version": "1.2.2", 1427 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz", 1428 | "integrity": "sha1-/YYxojvHgmvvXYcb24c3jJVkeCg=" 1429 | }, 1430 | "semver": { 1431 | "version": "5.3.0", 1432 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1433 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" 1434 | }, 1435 | "set-blocking": { 1436 | "version": "2.0.0", 1437 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1438 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1439 | }, 1440 | "shellwords": { 1441 | "version": "0.1.0", 1442 | "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz", 1443 | "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=" 1444 | }, 1445 | "slash": { 1446 | "version": "1.0.0", 1447 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 1448 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" 1449 | }, 1450 | "sntp": { 1451 | "version": "1.0.9", 1452 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 1453 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" 1454 | }, 1455 | "source-map": { 1456 | "version": "0.5.6", 1457 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 1458 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" 1459 | }, 1460 | "source-map-support": { 1461 | "version": "0.4.15", 1462 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", 1463 | "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=" 1464 | }, 1465 | "spdx-correct": { 1466 | "version": "1.0.2", 1467 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 1468 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" 1469 | }, 1470 | "spdx-expression-parse": { 1471 | "version": "1.0.4", 1472 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 1473 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" 1474 | }, 1475 | "spdx-license-ids": { 1476 | "version": "1.2.2", 1477 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 1478 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" 1479 | }, 1480 | "sprintf-js": { 1481 | "version": "1.0.3", 1482 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1483 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1484 | }, 1485 | "sshpk": { 1486 | "version": "1.13.0", 1487 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", 1488 | "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", 1489 | "dependencies": { 1490 | "assert-plus": { 1491 | "version": "1.0.0", 1492 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 1493 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 1494 | } 1495 | } 1496 | }, 1497 | "string-length": { 1498 | "version": "1.0.1", 1499 | "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", 1500 | "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=" 1501 | }, 1502 | "string-width": { 1503 | "version": "1.0.2", 1504 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1505 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" 1506 | }, 1507 | "stringstream": { 1508 | "version": "0.0.5", 1509 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 1510 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 1511 | }, 1512 | "strip-ansi": { 1513 | "version": "3.0.1", 1514 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1515 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" 1516 | }, 1517 | "strip-bom": { 1518 | "version": "2.0.0", 1519 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1520 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" 1521 | }, 1522 | "supports-color": { 1523 | "version": "2.0.0", 1524 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1525 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 1526 | }, 1527 | "symbol-tree": { 1528 | "version": "3.2.2", 1529 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", 1530 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 1531 | }, 1532 | "test-exclude": { 1533 | "version": "4.1.1", 1534 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", 1535 | "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==" 1536 | }, 1537 | "throat": { 1538 | "version": "3.1.0", 1539 | "resolved": "https://registry.npmjs.org/throat/-/throat-3.1.0.tgz", 1540 | "integrity": "sha512-AvehafrUS8C2PWA4YgPsPV6qrM5e7yU7o7jpuRzXVjRcPrPQgBsL6lVFxHXZEtRjZTdF+J9S2dIUxbheUrxAHA==" 1541 | }, 1542 | "tmpl": { 1543 | "version": "1.0.4", 1544 | "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", 1545 | "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" 1546 | }, 1547 | "to-fast-properties": { 1548 | "version": "1.0.3", 1549 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 1550 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" 1551 | }, 1552 | "tough-cookie": { 1553 | "version": "2.3.2", 1554 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 1555 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" 1556 | }, 1557 | "tr46": { 1558 | "version": "0.0.3", 1559 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1560 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" 1561 | }, 1562 | "trim-right": { 1563 | "version": "1.0.1", 1564 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1565 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" 1566 | }, 1567 | "tunnel-agent": { 1568 | "version": "0.6.0", 1569 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1570 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" 1571 | }, 1572 | "tweetnacl": { 1573 | "version": "0.14.5", 1574 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1575 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1576 | "optional": true 1577 | }, 1578 | "type-check": { 1579 | "version": "0.3.2", 1580 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1581 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=" 1582 | }, 1583 | "typescript": { 1584 | "version": "2.3.4", 1585 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.4.tgz", 1586 | "integrity": "sha1-PTgyGCgjHkNPKHUUlZw3qCtin0I=" 1587 | }, 1588 | "uglify-js": { 1589 | "version": "2.8.28", 1590 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.28.tgz", 1591 | "integrity": "sha512-WqKNbmNJKzIdIEQu/U2ytgGBbhCy2PVks94GoetczOAJ/zCgVu2CuO7gguI5KPFGPtUtI1dmPQl6h0D4cPzypA==", 1592 | "optional": true, 1593 | "dependencies": { 1594 | "yargs": { 1595 | "version": "3.10.0", 1596 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 1597 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1598 | "optional": true 1599 | } 1600 | } 1601 | }, 1602 | "uglify-to-browserify": { 1603 | "version": "1.0.2", 1604 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1605 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1606 | "optional": true 1607 | }, 1608 | "uuid": { 1609 | "version": "3.0.1", 1610 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", 1611 | "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" 1612 | }, 1613 | "validate-npm-package-license": { 1614 | "version": "3.0.1", 1615 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 1616 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" 1617 | }, 1618 | "verror": { 1619 | "version": "1.3.6", 1620 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", 1621 | "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=" 1622 | }, 1623 | "walker": { 1624 | "version": "1.0.7", 1625 | "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", 1626 | "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=" 1627 | }, 1628 | "watch": { 1629 | "version": "0.10.0", 1630 | "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", 1631 | "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=" 1632 | }, 1633 | "webidl-conversions": { 1634 | "version": "4.0.1", 1635 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.1.tgz", 1636 | "integrity": "sha1-gBWherg+fhsxFjhIas6B2mziBqA=" 1637 | }, 1638 | "whatwg-encoding": { 1639 | "version": "1.0.1", 1640 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", 1641 | "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=" 1642 | }, 1643 | "whatwg-url": { 1644 | "version": "4.8.0", 1645 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", 1646 | "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", 1647 | "dependencies": { 1648 | "webidl-conversions": { 1649 | "version": "3.0.1", 1650 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1651 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" 1652 | } 1653 | } 1654 | }, 1655 | "which": { 1656 | "version": "1.2.14", 1657 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 1658 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=" 1659 | }, 1660 | "which-module": { 1661 | "version": "1.0.0", 1662 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", 1663 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" 1664 | }, 1665 | "window-size": { 1666 | "version": "0.1.0", 1667 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1668 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 1669 | "optional": true 1670 | }, 1671 | "wordwrap": { 1672 | "version": "0.0.3", 1673 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1674 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 1675 | }, 1676 | "worker-farm": { 1677 | "version": "1.3.1", 1678 | "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.3.1.tgz", 1679 | "integrity": "sha1-QzMRK7SbF6oFC4eJXKayys9A5f8=" 1680 | }, 1681 | "wrap-ansi": { 1682 | "version": "2.1.0", 1683 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1684 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" 1685 | }, 1686 | "wrappy": { 1687 | "version": "1.0.2", 1688 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1689 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1690 | }, 1691 | "xml-name-validator": { 1692 | "version": "2.0.1", 1693 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", 1694 | "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" 1695 | }, 1696 | "xtend": { 1697 | "version": "4.0.1", 1698 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1699 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1700 | }, 1701 | "y18n": { 1702 | "version": "3.2.1", 1703 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 1704 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 1705 | }, 1706 | "yargs": { 1707 | "version": "7.1.0", 1708 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", 1709 | "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", 1710 | "dependencies": { 1711 | "camelcase": { 1712 | "version": "3.0.0", 1713 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 1714 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 1715 | }, 1716 | "cliui": { 1717 | "version": "3.2.0", 1718 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 1719 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=" 1720 | } 1721 | } 1722 | }, 1723 | "yargs-parser": { 1724 | "version": "5.0.0", 1725 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", 1726 | "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", 1727 | "dependencies": { 1728 | "camelcase": { 1729 | "version": "3.0.0", 1730 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 1731 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 1732 | } 1733 | } 1734 | } 1735 | } 1736 | } 1737 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pattern-matching-with-typescript", 3 | "version": "1.0.0", 4 | "description": "Complementary examples for the article \"Pattern Matching with TypeScript\"", 5 | "private": true, 6 | "directories": { 7 | "example": "examples" 8 | }, 9 | "scripts": { 10 | "test": "jest", 11 | "prettier": "prettier --write --single-quote examples/**/*.ts" 12 | }, 13 | "author": "Manuel Alabor ", 14 | "license": "MIT", 15 | "dependencies": { 16 | "@types/jest": "^19.2.4", 17 | "jest": "^20.0.4", 18 | "prettier": "^1.4.2", 19 | "typescript": "^2.3.4" 20 | }, 21 | "jest": { 22 | "moduleFileExtensions": [ 23 | "ts", 24 | "js" 25 | ], 26 | "transform": { 27 | "^.+\\.(ts)$": "/.jest/ts-preprocessor.js" 28 | }, 29 | "testMatch": [ 30 | "**/*.test.ts" 31 | ] 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": [ 3 | "node_modules", 4 | "examples/**/*.test.ts" 5 | ], 6 | "compilerOptions": { 7 | "target": "es5", 8 | "module": "commonjs", 9 | "outDir": "./build", 10 | "strict": true 11 | } 12 | } --------------------------------------------------------------------------------