├── .gitignore ├── README.md ├── answers ├── README.md ├── ch03.ts ├── ch04.ts ├── ch05.ts ├── ch06.ts ├── ch07.ts ├── ch08.ts ├── ch10.ts ├── package-lock.json ├── package.json └── tsconfig.json ├── furoku-h ├── .eslintrc.js ├── .gitignore ├── .prettierrc ├── README.md ├── eslint-rules │ └── no-parameter-properties.ts ├── my-class.ts ├── package-lock.json ├── package.json └── tsconfig.json └── programming-typescript-ja.png /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *~ 3 | node_modules 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # プログラミングTypeScript 2 | 3 | --- 4 | 5 | ![表紙](programming-typescript-ja.png) 6 | 7 | --- 8 | 9 | 本リポジトリはオライリー・ジャパン発行書籍『[プログラミングTypeScript](http://www.oreilly.co.jp/books/9784873119045/)』(原書名『[Programming TypeScript](http://shop.oreilly.com/product/0636920158059.do)』)のサポートサイトです。 10 | 11 | ## 構成 12 | 13 | |フォルダー名 |説明 | 14 | |:-- |:-- | 15 | |[answers](./answers) |練習問題の答え | 16 | |[furoku-h](./furoku-h) |日本語版オリジナルの「付録H ESLintとAST」のサンプルコード | 17 | 18 | ## 正誤表 19 | 20 | 本書の正誤情報は以下のページで公開しています。 21 | 22 | https://github.com/oreilly-japan/programming-typescript-ja/wiki/errata 23 | 24 | 本ページに掲載されていない誤植など間違いを見つけた方は、[japan@oreilly.co.jp]()までお知らせください。 25 | 26 | ## TypeScriptのバージョンについて 27 | 28 | 本書の原著は2019年5月に出版されたもので、その時点でのTypeScriptの最新バージョンである、3.4までの機能がおおむねカバーされています。また翻訳にあたり、翻訳時点での最新バージョンである3.8までに変更のあった機能については、適宜記述を修正しています。 29 | -------------------------------------------------------------------------------- /answers/README.md: -------------------------------------------------------------------------------- 1 | # 練習問題の答え 2 | 3 | ## 使用方法 4 | 5 | はじめに依存パッケージをインストールしてください。 6 | IDEでファイルを開いたときに、TypeScriptのエラーなどの情報を確認できるようになります。 7 | 8 | ```sh 9 | $ npm install 10 | ``` 11 | -------------------------------------------------------------------------------- /answers/ch03.ts: -------------------------------------------------------------------------------- 1 | export default null // モジュールモードを強制します 2 | 3 | // 1. 次のそれぞれの値について、TypeScriptはどのような型を推論するでしょうか? 4 | 5 | // 1a 6 | let a = 1042 // number 7 | 8 | // 1b 9 | let b = 'apples and oranges' // string 10 | 11 | // 1c 12 | const c = 'pineapples' // 'pineapples' 13 | 14 | // 1d 15 | let d = [true, true, false] // boolean[] 16 | 17 | // 1e 18 | let e = {type: 'ficus'} // {type: string} 19 | 20 | // 1f 21 | let f = [1, false] // (number | boolean)[] 22 | 23 | // 1g 24 | const g = [3] // number[] 25 | 26 | // 1h 27 | let h = null // any 28 | 29 | // 2. 次のそれぞれのものは、なぜエラーをスローするのでしょうか? 30 | 31 | // 2a 32 | let i: 3 = 3 33 | i = 4 // エラー TS2322: 型 '4' を型 '3' に割り当てることはできません。 34 | 35 | /* 36 | iの型はリテラル型の3です。4の型はリテラル型の4であり、これをリテラル型の3に割り当てることはできません。 37 | */ 38 | 39 | // 2b 40 | let j = [1, 2, 3] 41 | j.push(4) 42 | j.push('5') // エラー TS2345: 型 '"5"' の引数を型 'number' の 43 | // パラメーターに割り当てることはできません。 44 | 45 | /* 46 | jはnumberのセットを使って初期化されたので、TypeScriptはjの型をnumber[]と推論しました。'5'の型はリテラル型の'5'であり、これをnumberに割り当てることはできません。 47 | */ 48 | 49 | // 2c 50 | let k: never = 4 // エラー TS2322: 型 '4' を型 'never' に 51 | // 割り当てることはできません。 52 | 53 | /* 54 | neverはボトム型です。つまり、neverを他のすべての型に割り当てることはできますが、neverにはどの型も割り当てることができません。 55 | */ 56 | 57 | // 2d 58 | let l: unknown = 4 59 | let m = l * 2 // エラー TS2571: オブジェクトの型は 'unknown' です。 60 | 61 | /* 62 | unknownは、実行時に何にでもなりうる値を表します。あなたがしていることが安全であることをTypeScriptに示すには、まず、unknown型の値が、実際にはより具体的なサブタイプを持っていることをTypeScriptに示す必要があります。これを行うには、typeof、instanceof、または他の型クエリーや型ガードを使って値を絞り込みます。 63 | */ 64 | -------------------------------------------------------------------------------- /answers/ch04.ts: -------------------------------------------------------------------------------- 1 | export default null // モジュールモードを強制します 2 | 3 | // 1. TypeScriptは、関数の型シグネチャのうち、どの部分を推論するでしょうか? パラメーターでしょうか、戻り値の型でしょうか、それともその両方でしょうか? 4 | 5 | /* TypeScriptは常に関数の戻り値の型を推論します。文脈から推論できる場合は、関数のパラメーター型を推論することもあります(たとえば、その関数がコールバックの場合)。 */ 6 | 7 | // 2. JavaScriptのargumentsオブジェクトは型安全でしょうか? もしそうでないとすると、代わりに何が使えるでしょうか? 8 | 9 | /* argumentsは型安全ではありません。代わりに、次のようにレストパラメーターを使用すべきです。 10 | 11 | 変更前:function f() { console.log(arguments) } 12 | 13 | 変更後:function f(...args: unknown[]) { console.log(args) } 14 | */ 15 | 16 | // 3. すぐに出発する旅行を予約する機能が欲しいとします。オーバーロードされたreserve関数(「4.1.9 オーバーロードされた関数の型」を参照)を、3番目の呼び出しシグネチャを作成して書き換えてください。このシグネチャは、目的地(destination)だけを取り、明示的な出発日(from)は取りません。 17 | 18 | type Reservation = unknown 19 | 20 | type Reserve = { 21 | (from: Date, to: Date, destination: string): Reservation 22 | (from: Date, destination: string): Reservation 23 | (destination: string): Reservation 24 | } 25 | 26 | let reserve: Reserve = ( 27 | fromOrDestination: Date | string, 28 | toOrDestination?: Date | string, 29 | destination?: string 30 | ) => { 31 | if ( 32 | fromOrDestination instanceof Date && 33 | toOrDestination instanceof Date && 34 | destination !== undefined 35 | ) { 36 | // 宿泊旅行を予約する 37 | } else if ( 38 | fromOrDestination instanceof Date && 39 | typeof toOrDestination === 'string' 40 | ) { 41 | // 日帰り旅行を予約する 42 | } else if (typeof fromOrDestination === 'string') { 43 | // すぐに出発する旅行を予約する 44 | } 45 | } 46 | 47 | // 4. [難問]callの実装(「4.2.5.2 制限付きポリモーフィズムを使って、可変長引数をモデル化する」を参照)を、2番目の引数がstringである関数についてだけ機能するように書き換えてください。そうではない関数を渡すと、コンパイル時にエラーとなるようにします。 48 | 49 | function call( 50 | f: (...args: T) => R, 51 | ...args: T 52 | ): R { 53 | return f(...args) 54 | } 55 | 56 | function fill(length: number, value: string): string[] { 57 | return Array.from({length}, () => value) 58 | } 59 | 60 | call(fill, 10, 'a') // string[] 61 | 62 | // 5. 型安全なアサーション関数、`is`を実装してください。型で概略を記述することから始めます。これは、完成したら、次のように使えるものです。 63 | 64 | // stringとstringを比較します 65 | is('string', 'otherstring') // false 66 | 67 | // booleanとbooleanを比較します 68 | is(true, false) // false 69 | 70 | // numberとnumberを比較します 71 | is(42, 42) // true 72 | 73 | // 異なる型同士を比較すると、コンパイル時エラーになります 74 | is(10, 'foo') // エラー TS2345: 型 '"foo"' の引数を型 'number' の 75 | // パラメーターに割り当てることはできません。 76 | 77 | // [難問]任意の数の引数を渡せるようにします 78 | is(1, 1, 1) // true 79 | is(1, 2, 3) // false 80 | 81 | function is(a: T, ...b: [T, ...T[]]): boolean { 82 | return b.every(_ => _ === a) 83 | } 84 | -------------------------------------------------------------------------------- /answers/ch05.ts: -------------------------------------------------------------------------------- 1 | export default null // モジュールモードを強制します 2 | 3 | // 1. クラスとインターフェースの違いは何でしょうか? 4 | 5 | /* クラスは、実装、初期化されたクラスフィールド、アクセス修飾子を持つことができます。また、クラスはJavaScriptコードを生成するので、実行時のinstanceofのチェックもサポートしています。クラスは、型と値の両方を定義します。インターフェースは型だけを定義し、JavaScriptコードはいっさい生成せず、型レベルのメンバーだけを含むことができ、アクセス修飾子を含むことはできません。 */ 6 | 7 | // 2. クラスのコンストラクターをprivateと指定すると、そのクラスをインスタンス化したり拡張したりできないという意味になります。代わりにprotectedと指定すると、何が起こるでしょうか? コードエディターでいろいろと試してみてください。 8 | 9 | class A { 10 | protected constructor() {} 11 | } 12 | 13 | class B extends A {} // OK 14 | new A() // エラー 15 | new B() // エラー 16 | 17 | /* protectedコンストラクターを持つクラスは、privateコンストラクターを持つクラスと違って、拡張することができます。ただし、どちらのクラスも、newすることはできません。 */ 18 | 19 | // 3. 「5.11.1 ファクトリーパターン」で作成した実装を拡張して、抽象化を多少犠牲にしてでも、より安全にしてください。つまり、Shoe.create('boot')を呼び出すとBootが返され、Shoe.create('balletFlat')を呼び出すとBalletFlatが返されることを(どちらもShoeが返されるのではなく)、利用者がコンパイル時にわかるように、実装を書き換えてください。ヒント:「4.1.9 オーバーロードされた関数の型」を思い出してください。 20 | 21 | type Shoe = { 22 | purpose: string 23 | } 24 | 25 | class BalletFlat implements Shoe { 26 | purpose = 'dancing' 27 | } 28 | 29 | class Boot implements Shoe { 30 | purpose = 'woodcutting' 31 | } 32 | 33 | class Sneaker implements Shoe { 34 | purpose = 'walking' 35 | } 36 | 37 | type ShoeCreator = { 38 | create(type: 'balletFlat'): BalletFlat 39 | create(type: 'boot'): Boot 40 | create(type: 'sneaker'): Sneaker 41 | } 42 | 43 | let Shoe: ShoeCreator = { 44 | create(type: 'balletFlat' | 'boot' | 'sneaker'): Shoe { 45 | switch (type) { 46 | case 'balletFlat': 47 | return new BalletFlat() 48 | case 'boot': 49 | return new Boot() 50 | case 'sneaker': 51 | return new Sneaker() 52 | } 53 | } 54 | } 55 | 56 | Shoe.create('balletFlat') // BalletFlat 57 | Shoe.create('boot') // Boot 58 | Shoe.create('sneaker') // Sneaker 59 | 60 | // 4. [難問]練習として、型安全なビルダーパターンをどうしたら設計できるか考えてみてください。次のことを実現できるように、「5.11.2 ビルダーパターン」のビルダーパターンを拡張します。 61 | 62 | // 4a. 少なくともURLとメソッドの設定が終わるまでは.sendを呼び出せないことをコンパイル時に保証します。メソッドを特定の順序で呼び出すことをユーザーに強制したら、これを保証することは容易になるでしょうか?(ヒント:thisの代わりに何を返せるでしょうか?) 63 | 64 | class RequestBuilder { 65 | protected data: object | null = null 66 | protected method: 'get' | 'post' | null = null 67 | protected url: string | null = null 68 | 69 | setMethod(method: 'get' | 'post'): RequestBuilderWithMethod { 70 | return new RequestBuilderWithMethod().setMethod(method).setData(this.data) 71 | } 72 | setData(data: object | null): this { 73 | this.data = data 74 | return this 75 | } 76 | } 77 | 78 | class RequestBuilderWithMethod extends RequestBuilder { 79 | setMethod(method: 'get' | 'post' | null): this { 80 | this.method = method 81 | return this 82 | } 83 | setURL(url: string): RequestBuilderWithMethodAndURL { 84 | return new RequestBuilderWithMethodAndURL() 85 | .setMethod(this.method) 86 | .setURL(url) 87 | .setData(this.data) 88 | } 89 | } 90 | 91 | class RequestBuilderWithMethodAndURL extends RequestBuilderWithMethod { 92 | setURL(url: string): this { 93 | this.url = url 94 | return this 95 | } 96 | send() { 97 | // ... 98 | } 99 | } 100 | 101 | new RequestBuilder() 102 | .setMethod('get') 103 | .setData({}) 104 | .setURL('foo.com') 105 | .send() 106 | 107 | // 4b. [より難問]ユーザーがメソッドを任意の順序で呼び出せるようにしたまま、これを保証したいとしたら、設計をどのように変更すればよいでしょうか? 108 | 109 | // (この解答は@albertywuの協力によるものです) 110 | 111 | interface BuildableRequest { 112 | data?: object 113 | method: 'get' | 'post' 114 | url: string 115 | } 116 | 117 | class RequestBuilder2 { 118 | data?: object 119 | method?: 'get' | 'post' 120 | url?: string 121 | 122 | setData(data: object): this & Pick { 123 | return Object.assign(this, {data}) 124 | } 125 | 126 | setMethod(method: 'get' | 'post'): this & Pick { 127 | return Object.assign(this, {method}) 128 | } 129 | 130 | setURL(url: string): this & Pick { 131 | return Object.assign(this, {url}) 132 | } 133 | 134 | build(this: BuildableRequest) { 135 | return this 136 | } 137 | } 138 | 139 | new RequestBuilder2() 140 | .setData({}) 141 | .setMethod('post') // これを削除してみてください! 142 | .setURL('bar') // これを削除してみてください! 143 | .build() 144 | -------------------------------------------------------------------------------- /answers/ch06.ts: -------------------------------------------------------------------------------- 1 | export default null // モジュールモードを強制します 2 | 3 | // 1. 次のそれぞれの型のペアについて、最初の型が2番目の型に割り当て可能かどうかを、その理由も添えて答えてください。サブタイプと変性の観点からこれらについて考え、もし確信を持って答えられなければ、章の初めのほうのルールを参照してください(それでも確信が持てなければ、コードエディターに入力してチェックしてください)。 4 | 5 | // 1a. 1 と number 6 | 7 | let a: number 8 | a = 1 as 1 9 | 10 | /* 割り当て可能です。リテラル型の1はnumberのサブタイプなので、numberに割り当てることができます。 */ 11 | 12 | // 1b. number と 1 13 | 14 | let b: 1 15 | b = 2 as number 16 | 17 | /* 割り当て可能ではありません。numberはリテラル型の1のスーパータイプなので、1に割り当てることはできません。 */ 18 | 19 | // 1c. string と number | string 20 | 21 | let c: number | string 22 | c = 'foo' as string 23 | 24 | /* 割り当て可能です。stringはnumber | stringのサブタイプなので、number | stringに割り当てることができます。 */ 25 | 26 | // 1d. boolean と number 27 | 28 | let d: number 29 | d = true as boolean 30 | 31 | /* 割り当て可能ではありません。boolean型とnumber型は関係がありません。 */ 32 | 33 | // 1e. number[] と (number | string)[] 34 | 35 | let e: (number | string)[] 36 | e = [1] as number[] 37 | 38 | /* 割り当て可能です。配列はそのメンバーに関して共変なので、配列が別の配列に割り当て可能であるためには、「そのメンバー <: 別の配列のメンバー」でなければなりません。numberはnumber | stringのサブタイプなので、number[]を(number | string)[]に割り当てることができます。 */ 39 | 40 | // 1f. (number | string)[] と number[] 41 | 42 | let f: number[] 43 | f = [1] as (number | string)[] 44 | 45 | /* 割り当て可能ではありません。配列はそのメンバーに関して共変なので、配列が別の配列に割り当て可能であるためには、「そのメンバー <: 別の配列のメンバー」でなければなりません。number | stringはnumberのサブタイプではなく、スーパータイプなので、(number | string)[]をnumber[]に割り当てることはできません。 */ 46 | 47 | // 1g. {a: true} と {a: boolean} 48 | 49 | let g: {a: boolean} 50 | g = {a: true} as {a: true} 51 | 52 | /* 割り当て可能です。オブジェクトはそのメンバーに関して共変なので、オブジェクトが別のオブジェクトに割り当て可能であるためには、「そのそれぞれのメンバー <: 別のオブジェクトのメンバー」でなければなりません。このオブジェクトはaという1つのメンバーだけを持ち、その型はリテラル型のtrueです。「true <: boolean」なので、{a: true} というオブジェクト全体を {a: boolean} に割り当てることができます。 */ 53 | 54 | // 1h. {a: {b: [string]}} と {a: {b: [number | string]}} 55 | 56 | let h: {a: {b: [number | string]}} 57 | h = {a: {b: ['c']}} as {a: {b: [string]}} 58 | 59 | /* 割り当て可能です。(e)から(g)のルールを組み合わせると、ネストされたオブジェクトが別のオブジェクトに割り当て可能であるためには、「そのそれぞれのメンバー <: 別のオブジェクトのメンバー」でなければなりません。これを再帰的に繰り返します。 60 | 61 | {a: {b: [string]}} は {a: {b: [number | string]}} に割り当て可能か? 62 | 以下が真であれば、割り当て可能です: 63 | {b: [string]} は {b: [number | string]} に割り当て可能か? 64 | 以下が真であれば、割り当て可能です: 65 | [string] は [number | string] に割り当て可能か? 66 | 以下が真であれば、割り当て可能です: 67 | string は number | string に割り当て可能か? 68 | string は number | string という合併型に含まれているので、割り当て可能です。 69 | */ 70 | 71 | // 1i. (a: number) => string と (b: number) => string 72 | 73 | let i: (b: number) => string 74 | i = ((b: number) => 'c') as (b: number) => string 75 | 76 | /* 割り当て可能です。関数が別の関数に割り当て可能であるためには、「そのそれぞれのパラメーター >: 別の関数のパラメーター」および「その戻り値の型 <: 別の関数の戻り値の型」でなければなりません。「number >: number」であり、「string <: string」なので、この関数型は割り当て可能です。 */ 77 | 78 | // 1j. (a: number) => string と (a: string) => string 79 | 80 | let j: (a: string) => string 81 | j = ((a: number) => 'b') as (a: number) => string 82 | 83 | /* 割り当て可能ではありません。関数が別の関数に割り当て可能であるためには、「そのそれぞれのパラメーター >: 別の関数のパラメーター」および「その戻り値の型 <: 別の関数の戻り値の型」でなければなりません。numberはstringとは関係がないので、「number >: string」ではなく、この関数型は割り当て可能ではありません。 */ 84 | 85 | // 1k. (a: number | string) => string と (a: string) => string 86 | 87 | let k: (a: string) => string 88 | k = ((a: number | string) => 'b') as (a: number | string) => string 89 | 90 | /* 割り当て可能です。関数が別の関数に割り当て可能であるためには、「そのそれぞれのパラメーター >: 別の関数のパラメーター」および「その戻り値の型 <: 別の関数の戻り値の型」でなければなりません。number | stringはstringのスーパータイプであり、「string <: string」なので、この関数型は割り当て可能です。 */ 91 | 92 | // 1l. (列挙型 enum E {X = 'X'} で定義されている)E.X と(列挙型 enum F {X = 'X'} で定義されている)F.X 93 | 94 | enum E { 95 | X = 'X' 96 | } 97 | enum F { 98 | X = 'X' 99 | } 100 | let l: F.X 101 | l = E.X as E.X 102 | 103 | /* 割り当て可能ではありません。列挙型のメンバーが別の列挙型のメンバーに割り当て可能であるためには、同じ列挙型に由来するものでなければなりません。どちらのメンバーもXという名前であり、同じ文字列値'X'を持っていますが、それらは異なる列挙型について定義されているので、それらを互いに割り当てることはできません。 */ 104 | 105 | // 2. type O = {a: {b: {c: string}}} というオブジェクト型がある場合、keyof Oの型は何になるでしょうか? O['a']['b']については、どうでしょうか? 106 | 107 | type O = {a: {b: {c: string}}} 108 | type P = keyof O // 'a' 109 | type Q = O['a']['b'] // {c: string} 110 | 111 | // 3. TかUのどちらかに含まれる(ただし両方には含まれない)型を計算するExclusive型を記述してください。たとえば、Exclusive<1 | 2 | 3, 2 | 3 | 4>は、1 | 4になります。Exclusive<1 | 2, 2 | 4>を型チェッカーがどのように評価するかを、ステップごとに書き出してください。 112 | 113 | type Exclusive = Exclude | Exclude 114 | 115 | type R = Exclusive<1 | 2 | 3, 2 | 3 | 4> // 1 | 4 116 | type U = Exclusive<1 | 2, 2 | 4> 117 | 118 | /* 119 | 1. Exclusive<1 | 2, 2 | 4> から始めます。 120 | 2. Exclude<1 | 2, 2 | 4> | Exclude<2 | 4, 1 | 2> に置き換えます。 121 | 3. (1 | 2 extends 2 | 4 ? never : 1 | 2) | (2 | 4 extends 1 | 2 ? never : 2 | 4) に置き換えます。 122 | 4. (1 extends 2 | 4 ? never : 1) | (2 extends 2 | 4 ? never : 2) | (2 extends 1 | 2 ? never : 2) | (4 extends 1 | 2 ? never : 4) と分配します。 123 | 5. 1 | never | never | 4 と単純化します。 124 | 6. 1 | 4 と単純化します。 125 | */ 126 | 127 | // 4. 明確な割り当てアサーションを使わないように、(「6.6.3 明確な割り当てアサーション」の)例を書き直してください。 128 | 129 | let globalCache = { 130 | get(key: string) { 131 | return 'user' 132 | } 133 | } 134 | 135 | let userId = fetchUser() 136 | userId.toUpperCase() 137 | 138 | function fetchUser() { 139 | return globalCache.get('userId') 140 | } 141 | -------------------------------------------------------------------------------- /answers/ch07.ts: -------------------------------------------------------------------------------- 1 | export default null // モジュールモードを強制します 2 | 3 | // 1. この章で紹介したパターンのいずれかを使って、次に示すAPIに関するエラーの処理方法を設計してください。このAPIでは、すべての操作は失敗する可能性があります――失敗を考慮に入れるよう、APIのメソッドのシグネチャを自由に書き換えてください(もしくは、望むのであれば、書き換えずにそのまま使ってください)。発生するエラーを処理しながら、一連のアクションをどのように実行できるかについて考えてください(たとえば、ログインしたユーザーのIDを取得し、彼らの友人のリストを取得し、それぞれの友人の名前を取得する)。 4 | 5 | type UserID = unknown 6 | 7 | declare class API { 8 | getLoggedInUserID(): Option 9 | getFriendIDs(userID: UserID): Option 10 | getUserName(userID: UserID): Option 11 | } 12 | 13 | interface Option { 14 | flatMap(f: (value: T) => None): None 15 | flatMap(f: (value: T) => Option): Option 16 | getOrElse(value: T): T 17 | } 18 | class Some implements Option { 19 | constructor(private value: T) {} 20 | flatMap(f: (value: T) => None): None 21 | flatMap(f: (value: T) => Some): Some 22 | flatMap(f: (value: T) => Option): Option { 23 | return f(this.value) 24 | } 25 | getOrElse(): T { 26 | return this.value 27 | } 28 | } 29 | class None implements Option { 30 | flatMap(): None { 31 | return this 32 | } 33 | getOrElse(value: U): U { 34 | return value 35 | } 36 | } 37 | 38 | function listOfOptionsToOptionOfList(list: Option[]): Option { 39 | let empty = {} 40 | let result = list.map(_ => _.getOrElse(empty as T)).filter(_ => _ !== empty) 41 | if (result.length) { 42 | return new Some(result) 43 | } 44 | return new None() 45 | } 46 | 47 | let api = new API() 48 | let friendsUserNames = api 49 | .getLoggedInUserID() 50 | .flatMap(api.getFriendIDs) 51 | .flatMap(_ => listOfOptionsToOptionOfList(_.map(api.getUserName))) 52 | -------------------------------------------------------------------------------- /answers/ch08.ts: -------------------------------------------------------------------------------- 1 | export default null // モジュールモードを強制します 2 | 3 | // 1. 汎用的なpromisify関数を実装してください。promisifyは、1つの引数と1つのコールバックを取る任意の関数をパラメーターとして取り、それを、プロミスを返す関数の中にラップします。 4 | 5 | function promisify( 6 | f: (arg: A, f: (error: unknown, result: T | null) => void) => void 7 | ): (arg: A) => Promise { 8 | return (arg: A) => 9 | new Promise((resolve, reject) => 10 | f(arg, (error, result) => { 11 | if (error) { 12 | return reject(error) 13 | } 14 | if (result === null) { 15 | return reject(null) 16 | } 17 | resolve(result) 18 | }) 19 | ) 20 | } 21 | 22 | import {readFile} from 'fs' 23 | 24 | let readFilePromise = promisify(readFile) 25 | readFilePromise(__dirname + '/exercises.js') 26 | .then(result => console.log('done!', result.toString())) 27 | 28 | // 2. 「8.6.1.1 型安全なプロトコル」では、型安全な行列演算のためのプロトコルの半分を作成しました。これをメインスレッドで実行すると仮定して、Web Workerスレッドで実行する残りの半分を実装してください。 29 | 30 | type Matrix = number[][] 31 | 32 | type MatrixProtocol = { 33 | determinant: { 34 | in: [Matrix] 35 | out: number 36 | } 37 | 'dot-product': { 38 | in: [Matrix, Matrix] 39 | out: Matrix 40 | } 41 | invert: { 42 | in: [Matrix] 43 | out: Matrix 44 | } 45 | } 46 | 47 | // MainThread.ts 48 | type Protocol = { 49 | [command: string]: { 50 | in: unknown[] 51 | out: unknown 52 | } 53 | } 54 | 55 | function createProtocol

(script: string) { 56 | return (command: K) => (...args: P[K]['in']) => 57 | new Promise((resolve, reject) => { 58 | let worker = new Worker(script) 59 | worker.onerror = reject 60 | worker.onmessage = event => resolve(event.data) 61 | worker.postMessage({command, args}) 62 | }) 63 | } 64 | 65 | let runWithMatrixProtocol = createProtocol( 66 | 'MatrixWorkerScript.js' 67 | ) 68 | let parallelDeterminant = runWithMatrixProtocol('determinant') 69 | 70 | parallelDeterminant([[1, 2], [3, 4]]).then( 71 | determinant => console.log(determinant) // -2 72 | ) 73 | 74 | // WorkerScript.ts 75 | 76 | type Data< 77 | P extends Protocol, 78 | C extends keyof P = keyof P 79 | > = C extends C 80 | ? {command: C; args: P[C]['in']} 81 | : never 82 | 83 | function handle( 84 | data: Data 85 | ): MatrixProtocol[typeof data.command]['out'] { 86 | switch (data.command) { 87 | case 'determinant': 88 | return determinant(...data.args) 89 | case 'dot-product': 90 | return dotProduct(...data.args) 91 | case 'invert': 92 | return invert(...data.args) 93 | } 94 | } 95 | 96 | onmessage = ({data}) => postMessage(handle(data)) 97 | 98 | declare function determinant(matrix: Matrix): number 99 | declare function dotProduct(matrixA: Matrix, matrixB: Matrix): Matrix 100 | declare function invert(matrix: Matrix): Matrix 101 | 102 | // 3. (「8.6.1 Web Worker(ブラウザー)」のように)マップ型を使って、Node.jsの`child_process`用の型安全なメッセージパッシングプロトコルを実装してください。 103 | 104 | // MainThread.ts 105 | import {fork} from 'child_process' 106 | 107 | function createProtocolCP

(script: string) { 108 | return (command: K) => (...args: P[K]['in']) => 109 | new Promise((resolve, reject) => { 110 | let child = fork(script) 111 | child.on('error', reject) 112 | child.on('message', resolve) 113 | child.send({command, args}) 114 | }) 115 | } 116 | 117 | let runWithMatrixProtocolCP = createProtocolCP( 118 | './ChildThread.js' 119 | ) 120 | let parallelDeterminantCP = runWithMatrixProtocolCP('determinant') 121 | 122 | parallelDeterminantCP([[1, 2], [3, 4]]).then( 123 | determinant => console.log(determinant) // -2 124 | ) 125 | 126 | // ChildThread.ts 127 | 128 | // type Data ... (2のWorkerScript.tsと同様) 129 | // function handle ... (2のWorkerScript.tsと同様) 130 | 131 | process.on('message', data => process.send!(handle(data))) 132 | -------------------------------------------------------------------------------- /answers/ch10.ts: -------------------------------------------------------------------------------- 1 | export default null // モジュールモードを強制します 2 | 3 | // 1. 宣言のマージをいろいろと試してみて、次のことを行ってください。 4 | 5 | // 1a. 値と型の代わりに名前空間とインターフェースを使って、コンパニオンオブジェクトを実装し直してください。 6 | 7 | interface Currency { 8 | unit: 'EUR' | 'GBP' | 'JPY' | 'USD' 9 | value: number 10 | } 11 | 12 | namespace Currency { 13 | export let DEFAULT: Currency['unit'] = 'USD' 14 | export function from(value: number, unit = Currency.DEFAULT): Currency { 15 | return {unit, value} 16 | } 17 | } 18 | 19 | let amountDue: Currency = { 20 | unit: 'JPY', 21 | value: 83733.1 22 | } 23 | 24 | let otherAmountDue = Currency.from(330, 'EUR') 25 | 26 | // 1b. 列挙型に静的メソッドを追加してください。 27 | 28 | enum Color { 29 | RED = '#ff0000', 30 | GREEN = '#00ff00', 31 | BLUE = '#0000ff' 32 | } 33 | 34 | namespace Color { 35 | export function getClosest(to: string): Color { 36 | // ... 37 | } 38 | } 39 | 40 | Color.getClosest('#ffa500') 41 | -------------------------------------------------------------------------------- /answers/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "answers", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "13.7.0", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", 10 | "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==", 11 | "dev": true 12 | }, 13 | "typescript": { 14 | "version": "3.7.5", 15 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", 16 | "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", 17 | "dev": true 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /answers/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "answers", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "devDependencies": { 6 | "@types/node": "^13.7.0", 7 | "typescript": "^3.7.5" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /answers/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "esnext", "webworker"], 4 | "target": "es5", 5 | "module": "commonjs", 6 | "outDir": "dist", 7 | "strict": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /furoku-h/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | rules: { 5 | 'no-parameter-properties': 'error' 6 | }, 7 | parserOptions: { 8 | project: './tsconfig.json' 9 | }, 10 | plugins: [ 11 | '@typescript-eslint', 12 | 'prettier' 13 | ], 14 | extends: [ 15 | 'eslint:recommended', 16 | 'plugin:@typescript-eslint/eslint-recommended', 17 | 'plugin:@typescript-eslint/recommended', 18 | 'plugin:@typescript-eslint/recommended-requiring-type-checking', 19 | 'prettier/@typescript-eslint', 20 | 'plugin:prettier/recommended' 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /furoku-h/.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | !.eslintrc.js 3 | -------------------------------------------------------------------------------- /furoku-h/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false 4 | } 5 | -------------------------------------------------------------------------------- /furoku-h/README.md: -------------------------------------------------------------------------------- 1 | # 「付録H ESLintとAST」のサンプルコード 2 | 3 | ## 使用方法 4 | 5 | 下記のコマンドにより挙動を確認できます。 6 | 詳細な解説は書籍をご覧ください。 7 | 8 | ```sh 9 | # 依存パッケージのインストール 10 | $ npm install 11 | 12 | # ルールのコンパイル 13 | $ npx tsc eslint-rules/no-parameter-properties.ts 14 | 15 | # ルールの実行と自動修正の適用 16 | $ npx eslint my-class.ts --rulesdir eslint-rules --fix 17 | ``` 18 | -------------------------------------------------------------------------------- /furoku-h/eslint-rules/no-parameter-properties.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AST_NODE_TYPES, 3 | ESLintUtils, 4 | TSESTree 5 | } from '@typescript-eslint/experimental-utils' 6 | 7 | const createRule = ESLintUtils.RuleCreator(name => name) 8 | 9 | module.exports = createRule({ 10 | name: 'no-parameter-properties', 11 | meta: { 12 | type: 'problem', 13 | docs: { 14 | description: 'Disallow parameter properties of classes', 15 | category: 'Stylistic Issues', 16 | recommended: false 17 | }, 18 | messages: { 19 | parameterProperty: 'Parameter property {{name}} is not allowed.' 20 | }, 21 | schema: [], 22 | fixable: 'code' 23 | }, 24 | defaultOptions: [], 25 | create: ctx => ({ 26 | TSParameterProperty: node => { 27 | const { name } = 28 | node.parameter.type === AST_NODE_TYPES.Identifier 29 | ? node.parameter 30 | : ((node.parameter as TSESTree.AssignmentPattern) 31 | .left as TSESTree.Identifier) 32 | ctx.report({ 33 | node, 34 | messageId: 'parameterProperty', 35 | data: { name }, 36 | fix: fixer => { // ❷ 37 | // ❸ 38 | const typeChecker = ctx.parserServices?.program?.getTypeChecker() 39 | const tsNode = ctx.parserServices?.esTreeNodeToTSNodeMap?.get(node) 40 | if (!typeChecker || !tsNode) { 41 | throw new Error( 42 | 'Missing "parserOptions.project" for @typescript-eslint/parser.' 43 | ) 44 | } 45 | const modifiers = tsNode.modifiers! // ❹ 46 | const modifiersString = modifiers 47 | .map(modifier => modifier.getText()) 48 | .join(' ') 49 | // ❺ 50 | const constructorFn = node.parent as TSESTree.FunctionExpression 51 | const constructorBody = constructorFn.body! 52 | const classBody = (constructorFn.parent as TSESTree.MethodDefinition) 53 | .parent as TSESTree.ClassBody 54 | return [ 55 | fixer.insertTextAfterRange( // ❻ 56 | [classBody.range[0], classBody.range[0] + 1], 57 | `${modifiersString} ${name}: ${typeChecker.typeToString( 58 | typeChecker.getTypeAtLocation(tsNode) 59 | )};` 60 | ), 61 | fixer.removeRange([ // ❼ 62 | modifiers[0].getStart(), 63 | modifiers[modifiers.length - 1].getEnd() 64 | ]), 65 | fixer.insertTextAfterRange( // ❽ 66 | [constructorBody.range[0], constructorBody.range[0] + 1], 67 | `this.${name} = ${name};` 68 | ) 69 | ] 70 | } 71 | }) 72 | } 73 | }) 74 | }) 75 | -------------------------------------------------------------------------------- /furoku-h/my-class.ts: -------------------------------------------------------------------------------- 1 | declare const foo: Function 2 | 3 | class MyClass { 4 | private ok1 = 1 5 | ok2 = !this.ng1 6 | constructor( 7 | ok3: string, 8 | public readonly ng1: boolean, 9 | @foo private ng2 = 1, 10 | protected ng3?: RegExp 11 | ) {} 12 | } 13 | -------------------------------------------------------------------------------- /furoku-h/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "programming-typescript-furoku-h", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.8.3", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.8.3" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.8.3", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", 19 | "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@types/eslint-visitor-keys": { 28 | "version": "1.0.0", 29 | "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 30 | "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 31 | "dev": true 32 | }, 33 | "@types/json-schema": { 34 | "version": "7.0.4", 35 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", 36 | "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", 37 | "dev": true 38 | }, 39 | "@types/node": { 40 | "version": "13.5.0", 41 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.0.tgz", 42 | "integrity": "sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ==", 43 | "dev": true 44 | }, 45 | "@typescript-eslint/eslint-plugin": { 46 | "version": "2.17.0", 47 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.17.0.tgz", 48 | "integrity": "sha512-tg/OMOtPeXlvk0ES8mZzEZ4gd1ruSE03nsKcK+teJhxYv5CPCXK6Mb/OK6NpB4+CqGTHs4MVeoSZXNFqpT1PyQ==", 49 | "dev": true, 50 | "requires": { 51 | "@typescript-eslint/experimental-utils": "2.17.0", 52 | "eslint-utils": "^1.4.3", 53 | "functional-red-black-tree": "^1.0.1", 54 | "regexpp": "^3.0.0", 55 | "tsutils": "^3.17.1" 56 | } 57 | }, 58 | "@typescript-eslint/experimental-utils": { 59 | "version": "2.17.0", 60 | "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.17.0.tgz", 61 | "integrity": "sha512-2bNf+mZ/3mj5/3CP56v+ldRK3vFy9jOvmCPs/Gr2DeSJh+asPZrhFniv4QmQsHWQFPJFWhFHgkGgJeRmK4m8iQ==", 62 | "dev": true, 63 | "requires": { 64 | "@types/json-schema": "^7.0.3", 65 | "@typescript-eslint/typescript-estree": "2.17.0", 66 | "eslint-scope": "^5.0.0" 67 | } 68 | }, 69 | "@typescript-eslint/parser": { 70 | "version": "2.17.0", 71 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.17.0.tgz", 72 | "integrity": "sha512-k1g3gRQ4fwfJoIfgUpz78AovicSWKFANmvTfkAHP24MgJHjWfZI6ya7tsQZt1sLczvP4G9BE5G5MgADHdmJB/w==", 73 | "dev": true, 74 | "requires": { 75 | "@types/eslint-visitor-keys": "^1.0.0", 76 | "@typescript-eslint/experimental-utils": "2.17.0", 77 | "@typescript-eslint/typescript-estree": "2.17.0", 78 | "eslint-visitor-keys": "^1.1.0" 79 | } 80 | }, 81 | "@typescript-eslint/typescript-estree": { 82 | "version": "2.17.0", 83 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.17.0.tgz", 84 | "integrity": "sha512-g0eVRULGnEEUakxRfJO0s0Hr1LLQqsI6OrkiCLpdHtdJJek+wyd8mb00vedqAoWldeDcOcP8plqw8/jx9Gr3Lw==", 85 | "dev": true, 86 | "requires": { 87 | "debug": "^4.1.1", 88 | "eslint-visitor-keys": "^1.1.0", 89 | "glob": "^7.1.6", 90 | "is-glob": "^4.0.1", 91 | "lodash": "^4.17.15", 92 | "semver": "^6.3.0", 93 | "tsutils": "^3.17.1" 94 | } 95 | }, 96 | "acorn": { 97 | "version": "7.1.1", 98 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 99 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 100 | "dev": true 101 | }, 102 | "acorn-jsx": { 103 | "version": "5.1.0", 104 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", 105 | "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", 106 | "dev": true 107 | }, 108 | "ajv": { 109 | "version": "6.12.6", 110 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 111 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 112 | "dev": true, 113 | "requires": { 114 | "fast-deep-equal": "^3.1.1", 115 | "fast-json-stable-stringify": "^2.0.0", 116 | "json-schema-traverse": "^0.4.1", 117 | "uri-js": "^4.2.2" 118 | } 119 | }, 120 | "ansi-escapes": { 121 | "version": "4.3.0", 122 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", 123 | "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", 124 | "dev": true, 125 | "requires": { 126 | "type-fest": "^0.8.1" 127 | } 128 | }, 129 | "ansi-regex": { 130 | "version": "5.0.0", 131 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 132 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 133 | "dev": true 134 | }, 135 | "ansi-styles": { 136 | "version": "3.2.1", 137 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 138 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 139 | "dev": true, 140 | "requires": { 141 | "color-convert": "^1.9.0" 142 | } 143 | }, 144 | "argparse": { 145 | "version": "1.0.10", 146 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 147 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 148 | "dev": true, 149 | "requires": { 150 | "sprintf-js": "~1.0.2" 151 | } 152 | }, 153 | "astral-regex": { 154 | "version": "1.0.0", 155 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 156 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 157 | "dev": true 158 | }, 159 | "balanced-match": { 160 | "version": "1.0.0", 161 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 162 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 163 | "dev": true 164 | }, 165 | "brace-expansion": { 166 | "version": "1.1.11", 167 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 168 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 169 | "dev": true, 170 | "requires": { 171 | "balanced-match": "^1.0.0", 172 | "concat-map": "0.0.1" 173 | } 174 | }, 175 | "callsites": { 176 | "version": "3.1.0", 177 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 178 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 179 | "dev": true 180 | }, 181 | "chalk": { 182 | "version": "2.4.2", 183 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 184 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 185 | "dev": true, 186 | "requires": { 187 | "ansi-styles": "^3.2.1", 188 | "escape-string-regexp": "^1.0.5", 189 | "supports-color": "^5.3.0" 190 | } 191 | }, 192 | "chardet": { 193 | "version": "0.7.0", 194 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 195 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 196 | "dev": true 197 | }, 198 | "cli-cursor": { 199 | "version": "3.1.0", 200 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 201 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 202 | "dev": true, 203 | "requires": { 204 | "restore-cursor": "^3.1.0" 205 | } 206 | }, 207 | "cli-width": { 208 | "version": "2.2.0", 209 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 210 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 211 | "dev": true 212 | }, 213 | "color-convert": { 214 | "version": "1.9.3", 215 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 216 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 217 | "dev": true, 218 | "requires": { 219 | "color-name": "1.1.3" 220 | } 221 | }, 222 | "color-name": { 223 | "version": "1.1.3", 224 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 225 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 226 | "dev": true 227 | }, 228 | "concat-map": { 229 | "version": "0.0.1", 230 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 231 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 232 | "dev": true 233 | }, 234 | "cross-spawn": { 235 | "version": "6.0.5", 236 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 237 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 238 | "dev": true, 239 | "requires": { 240 | "nice-try": "^1.0.4", 241 | "path-key": "^2.0.1", 242 | "semver": "^5.5.0", 243 | "shebang-command": "^1.2.0", 244 | "which": "^1.2.9" 245 | }, 246 | "dependencies": { 247 | "semver": { 248 | "version": "5.7.1", 249 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 250 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 251 | "dev": true 252 | } 253 | } 254 | }, 255 | "debug": { 256 | "version": "4.1.1", 257 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 258 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 259 | "dev": true, 260 | "requires": { 261 | "ms": "^2.1.1" 262 | } 263 | }, 264 | "deep-is": { 265 | "version": "0.1.3", 266 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 267 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 268 | "dev": true 269 | }, 270 | "doctrine": { 271 | "version": "3.0.0", 272 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 273 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 274 | "dev": true, 275 | "requires": { 276 | "esutils": "^2.0.2" 277 | } 278 | }, 279 | "emoji-regex": { 280 | "version": "8.0.0", 281 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 282 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 283 | "dev": true 284 | }, 285 | "escape-string-regexp": { 286 | "version": "1.0.5", 287 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 288 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 289 | "dev": true 290 | }, 291 | "eslint": { 292 | "version": "6.8.0", 293 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 294 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 295 | "dev": true, 296 | "requires": { 297 | "@babel/code-frame": "^7.0.0", 298 | "ajv": "^6.10.0", 299 | "chalk": "^2.1.0", 300 | "cross-spawn": "^6.0.5", 301 | "debug": "^4.0.1", 302 | "doctrine": "^3.0.0", 303 | "eslint-scope": "^5.0.0", 304 | "eslint-utils": "^1.4.3", 305 | "eslint-visitor-keys": "^1.1.0", 306 | "espree": "^6.1.2", 307 | "esquery": "^1.0.1", 308 | "esutils": "^2.0.2", 309 | "file-entry-cache": "^5.0.1", 310 | "functional-red-black-tree": "^1.0.1", 311 | "glob-parent": "^5.0.0", 312 | "globals": "^12.1.0", 313 | "ignore": "^4.0.6", 314 | "import-fresh": "^3.0.0", 315 | "imurmurhash": "^0.1.4", 316 | "inquirer": "^7.0.0", 317 | "is-glob": "^4.0.0", 318 | "js-yaml": "^3.13.1", 319 | "json-stable-stringify-without-jsonify": "^1.0.1", 320 | "levn": "^0.3.0", 321 | "lodash": "^4.17.14", 322 | "minimatch": "^3.0.4", 323 | "mkdirp": "^0.5.1", 324 | "natural-compare": "^1.4.0", 325 | "optionator": "^0.8.3", 326 | "progress": "^2.0.0", 327 | "regexpp": "^2.0.1", 328 | "semver": "^6.1.2", 329 | "strip-ansi": "^5.2.0", 330 | "strip-json-comments": "^3.0.1", 331 | "table": "^5.2.3", 332 | "text-table": "^0.2.0", 333 | "v8-compile-cache": "^2.0.3" 334 | }, 335 | "dependencies": { 336 | "regexpp": { 337 | "version": "2.0.1", 338 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 339 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 340 | "dev": true 341 | } 342 | } 343 | }, 344 | "eslint-config-prettier": { 345 | "version": "6.9.0", 346 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.9.0.tgz", 347 | "integrity": "sha512-k4E14HBtcLv0uqThaI6I/n1LEqROp8XaPu6SO9Z32u5NlGRC07Enu1Bh2KEFw4FNHbekH8yzbIU9kUGxbiGmCA==", 348 | "dev": true, 349 | "requires": { 350 | "get-stdin": "^6.0.0" 351 | } 352 | }, 353 | "eslint-plugin-prettier": { 354 | "version": "3.1.2", 355 | "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", 356 | "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", 357 | "dev": true, 358 | "requires": { 359 | "prettier-linter-helpers": "^1.0.0" 360 | } 361 | }, 362 | "eslint-scope": { 363 | "version": "5.0.0", 364 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 365 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 366 | "dev": true, 367 | "requires": { 368 | "esrecurse": "^4.1.0", 369 | "estraverse": "^4.1.1" 370 | } 371 | }, 372 | "eslint-utils": { 373 | "version": "1.4.3", 374 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 375 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 376 | "dev": true, 377 | "requires": { 378 | "eslint-visitor-keys": "^1.1.0" 379 | } 380 | }, 381 | "eslint-visitor-keys": { 382 | "version": "1.1.0", 383 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 384 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 385 | "dev": true 386 | }, 387 | "espree": { 388 | "version": "6.1.2", 389 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", 390 | "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", 391 | "dev": true, 392 | "requires": { 393 | "acorn": "^7.1.0", 394 | "acorn-jsx": "^5.1.0", 395 | "eslint-visitor-keys": "^1.1.0" 396 | } 397 | }, 398 | "esprima": { 399 | "version": "4.0.1", 400 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 401 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 402 | "dev": true 403 | }, 404 | "esquery": { 405 | "version": "1.0.1", 406 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 407 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 408 | "dev": true, 409 | "requires": { 410 | "estraverse": "^4.0.0" 411 | } 412 | }, 413 | "esrecurse": { 414 | "version": "4.2.1", 415 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 416 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 417 | "dev": true, 418 | "requires": { 419 | "estraverse": "^4.1.0" 420 | } 421 | }, 422 | "estraverse": { 423 | "version": "4.3.0", 424 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 425 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 426 | "dev": true 427 | }, 428 | "esutils": { 429 | "version": "2.0.3", 430 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 431 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 432 | "dev": true 433 | }, 434 | "external-editor": { 435 | "version": "3.1.0", 436 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 437 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 438 | "dev": true, 439 | "requires": { 440 | "chardet": "^0.7.0", 441 | "iconv-lite": "^0.4.24", 442 | "tmp": "^0.0.33" 443 | } 444 | }, 445 | "fast-deep-equal": { 446 | "version": "3.1.1", 447 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 448 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 449 | "dev": true 450 | }, 451 | "fast-diff": { 452 | "version": "1.2.0", 453 | "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 454 | "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 455 | "dev": true 456 | }, 457 | "fast-json-stable-stringify": { 458 | "version": "2.1.0", 459 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 460 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 461 | "dev": true 462 | }, 463 | "fast-levenshtein": { 464 | "version": "2.0.6", 465 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 466 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 467 | "dev": true 468 | }, 469 | "figures": { 470 | "version": "3.1.0", 471 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", 472 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", 473 | "dev": true, 474 | "requires": { 475 | "escape-string-regexp": "^1.0.5" 476 | } 477 | }, 478 | "file-entry-cache": { 479 | "version": "5.0.1", 480 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 481 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 482 | "dev": true, 483 | "requires": { 484 | "flat-cache": "^2.0.1" 485 | } 486 | }, 487 | "flat-cache": { 488 | "version": "2.0.1", 489 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 490 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 491 | "dev": true, 492 | "requires": { 493 | "flatted": "^2.0.0", 494 | "rimraf": "2.6.3", 495 | "write": "1.0.3" 496 | } 497 | }, 498 | "flatted": { 499 | "version": "2.0.1", 500 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 501 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 502 | "dev": true 503 | }, 504 | "fs.realpath": { 505 | "version": "1.0.0", 506 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 507 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 508 | "dev": true 509 | }, 510 | "functional-red-black-tree": { 511 | "version": "1.0.1", 512 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 513 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 514 | "dev": true 515 | }, 516 | "get-stdin": { 517 | "version": "6.0.0", 518 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 519 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 520 | "dev": true 521 | }, 522 | "glob": { 523 | "version": "7.1.6", 524 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 525 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 526 | "dev": true, 527 | "requires": { 528 | "fs.realpath": "^1.0.0", 529 | "inflight": "^1.0.4", 530 | "inherits": "2", 531 | "minimatch": "^3.0.4", 532 | "once": "^1.3.0", 533 | "path-is-absolute": "^1.0.0" 534 | } 535 | }, 536 | "glob-parent": { 537 | "version": "5.1.2", 538 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 539 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 540 | "dev": true, 541 | "requires": { 542 | "is-glob": "^4.0.1" 543 | } 544 | }, 545 | "globals": { 546 | "version": "12.3.0", 547 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", 548 | "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", 549 | "dev": true, 550 | "requires": { 551 | "type-fest": "^0.8.1" 552 | } 553 | }, 554 | "has-flag": { 555 | "version": "3.0.0", 556 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 557 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 558 | "dev": true 559 | }, 560 | "iconv-lite": { 561 | "version": "0.4.24", 562 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 563 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 564 | "dev": true, 565 | "requires": { 566 | "safer-buffer": ">= 2.1.2 < 3" 567 | } 568 | }, 569 | "ignore": { 570 | "version": "4.0.6", 571 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 572 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 573 | "dev": true 574 | }, 575 | "import-fresh": { 576 | "version": "3.2.1", 577 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 578 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 579 | "dev": true, 580 | "requires": { 581 | "parent-module": "^1.0.0", 582 | "resolve-from": "^4.0.0" 583 | } 584 | }, 585 | "imurmurhash": { 586 | "version": "0.1.4", 587 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 588 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 589 | "dev": true 590 | }, 591 | "inflight": { 592 | "version": "1.0.6", 593 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 594 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 595 | "dev": true, 596 | "requires": { 597 | "once": "^1.3.0", 598 | "wrappy": "1" 599 | } 600 | }, 601 | "inherits": { 602 | "version": "2.0.4", 603 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 604 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 605 | "dev": true 606 | }, 607 | "inquirer": { 608 | "version": "7.0.4", 609 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", 610 | "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", 611 | "dev": true, 612 | "requires": { 613 | "ansi-escapes": "^4.2.1", 614 | "chalk": "^2.4.2", 615 | "cli-cursor": "^3.1.0", 616 | "cli-width": "^2.0.0", 617 | "external-editor": "^3.0.3", 618 | "figures": "^3.0.0", 619 | "lodash": "^4.17.15", 620 | "mute-stream": "0.0.8", 621 | "run-async": "^2.2.0", 622 | "rxjs": "^6.5.3", 623 | "string-width": "^4.1.0", 624 | "strip-ansi": "^5.1.0", 625 | "through": "^2.3.6" 626 | } 627 | }, 628 | "is-extglob": { 629 | "version": "2.1.1", 630 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 631 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 632 | "dev": true 633 | }, 634 | "is-fullwidth-code-point": { 635 | "version": "3.0.0", 636 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 637 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 638 | "dev": true 639 | }, 640 | "is-glob": { 641 | "version": "4.0.1", 642 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 643 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 644 | "dev": true, 645 | "requires": { 646 | "is-extglob": "^2.1.1" 647 | } 648 | }, 649 | "is-promise": { 650 | "version": "2.1.0", 651 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 652 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 653 | "dev": true 654 | }, 655 | "isexe": { 656 | "version": "2.0.0", 657 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 658 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 659 | "dev": true 660 | }, 661 | "js-tokens": { 662 | "version": "4.0.0", 663 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 664 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 665 | "dev": true 666 | }, 667 | "js-yaml": { 668 | "version": "3.13.1", 669 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 670 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 671 | "dev": true, 672 | "requires": { 673 | "argparse": "^1.0.7", 674 | "esprima": "^4.0.0" 675 | } 676 | }, 677 | "json-schema-traverse": { 678 | "version": "0.4.1", 679 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 680 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 681 | "dev": true 682 | }, 683 | "json-stable-stringify-without-jsonify": { 684 | "version": "1.0.1", 685 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 686 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 687 | "dev": true 688 | }, 689 | "levn": { 690 | "version": "0.3.0", 691 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 692 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 693 | "dev": true, 694 | "requires": { 695 | "prelude-ls": "~1.1.2", 696 | "type-check": "~0.3.2" 697 | } 698 | }, 699 | "lodash": { 700 | "version": "4.17.21", 701 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 702 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 703 | "dev": true 704 | }, 705 | "mimic-fn": { 706 | "version": "2.1.0", 707 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 708 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 709 | "dev": true 710 | }, 711 | "minimatch": { 712 | "version": "3.0.4", 713 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 714 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 715 | "dev": true, 716 | "requires": { 717 | "brace-expansion": "^1.1.7" 718 | } 719 | }, 720 | "minimist": { 721 | "version": "0.0.8", 722 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 723 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 724 | "dev": true 725 | }, 726 | "mkdirp": { 727 | "version": "0.5.1", 728 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 729 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 730 | "dev": true, 731 | "requires": { 732 | "minimist": "0.0.8" 733 | } 734 | }, 735 | "ms": { 736 | "version": "2.1.2", 737 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 738 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 739 | "dev": true 740 | }, 741 | "mute-stream": { 742 | "version": "0.0.8", 743 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 744 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 745 | "dev": true 746 | }, 747 | "natural-compare": { 748 | "version": "1.4.0", 749 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 750 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 751 | "dev": true 752 | }, 753 | "nice-try": { 754 | "version": "1.0.5", 755 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 756 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 757 | "dev": true 758 | }, 759 | "once": { 760 | "version": "1.4.0", 761 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 762 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 763 | "dev": true, 764 | "requires": { 765 | "wrappy": "1" 766 | } 767 | }, 768 | "onetime": { 769 | "version": "5.1.0", 770 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 771 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 772 | "dev": true, 773 | "requires": { 774 | "mimic-fn": "^2.1.0" 775 | } 776 | }, 777 | "optionator": { 778 | "version": "0.8.3", 779 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 780 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 781 | "dev": true, 782 | "requires": { 783 | "deep-is": "~0.1.3", 784 | "fast-levenshtein": "~2.0.6", 785 | "levn": "~0.3.0", 786 | "prelude-ls": "~1.1.2", 787 | "type-check": "~0.3.2", 788 | "word-wrap": "~1.2.3" 789 | } 790 | }, 791 | "os-tmpdir": { 792 | "version": "1.0.2", 793 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 794 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 795 | "dev": true 796 | }, 797 | "parent-module": { 798 | "version": "1.0.1", 799 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 800 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 801 | "dev": true, 802 | "requires": { 803 | "callsites": "^3.0.0" 804 | } 805 | }, 806 | "path-is-absolute": { 807 | "version": "1.0.1", 808 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 809 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 810 | "dev": true 811 | }, 812 | "path-key": { 813 | "version": "2.0.1", 814 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 815 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 816 | "dev": true 817 | }, 818 | "prelude-ls": { 819 | "version": "1.1.2", 820 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 821 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 822 | "dev": true 823 | }, 824 | "prettier": { 825 | "version": "1.19.1", 826 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", 827 | "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", 828 | "dev": true 829 | }, 830 | "prettier-linter-helpers": { 831 | "version": "1.0.0", 832 | "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 833 | "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 834 | "dev": true, 835 | "requires": { 836 | "fast-diff": "^1.1.2" 837 | } 838 | }, 839 | "progress": { 840 | "version": "2.0.3", 841 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 842 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 843 | "dev": true 844 | }, 845 | "punycode": { 846 | "version": "2.1.1", 847 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 848 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 849 | "dev": true 850 | }, 851 | "regexpp": { 852 | "version": "3.0.0", 853 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", 854 | "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", 855 | "dev": true 856 | }, 857 | "resolve-from": { 858 | "version": "4.0.0", 859 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 860 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 861 | "dev": true 862 | }, 863 | "restore-cursor": { 864 | "version": "3.1.0", 865 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 866 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 867 | "dev": true, 868 | "requires": { 869 | "onetime": "^5.1.0", 870 | "signal-exit": "^3.0.2" 871 | } 872 | }, 873 | "rimraf": { 874 | "version": "2.6.3", 875 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 876 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 877 | "dev": true, 878 | "requires": { 879 | "glob": "^7.1.3" 880 | } 881 | }, 882 | "run-async": { 883 | "version": "2.3.0", 884 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 885 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 886 | "dev": true, 887 | "requires": { 888 | "is-promise": "^2.1.0" 889 | } 890 | }, 891 | "rxjs": { 892 | "version": "6.5.4", 893 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", 894 | "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", 895 | "dev": true, 896 | "requires": { 897 | "tslib": "^1.9.0" 898 | } 899 | }, 900 | "safer-buffer": { 901 | "version": "2.1.2", 902 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 903 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 904 | "dev": true 905 | }, 906 | "semver": { 907 | "version": "6.3.0", 908 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 909 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 910 | "dev": true 911 | }, 912 | "shebang-command": { 913 | "version": "1.2.0", 914 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 915 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 916 | "dev": true, 917 | "requires": { 918 | "shebang-regex": "^1.0.0" 919 | } 920 | }, 921 | "shebang-regex": { 922 | "version": "1.0.0", 923 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 924 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 925 | "dev": true 926 | }, 927 | "signal-exit": { 928 | "version": "3.0.2", 929 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 930 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 931 | "dev": true 932 | }, 933 | "slice-ansi": { 934 | "version": "2.1.0", 935 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 936 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 937 | "dev": true, 938 | "requires": { 939 | "ansi-styles": "^3.2.0", 940 | "astral-regex": "^1.0.0", 941 | "is-fullwidth-code-point": "^2.0.0" 942 | }, 943 | "dependencies": { 944 | "is-fullwidth-code-point": { 945 | "version": "2.0.0", 946 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 947 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 948 | "dev": true 949 | } 950 | } 951 | }, 952 | "sprintf-js": { 953 | "version": "1.0.3", 954 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 955 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 956 | "dev": true 957 | }, 958 | "string-width": { 959 | "version": "4.2.0", 960 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 961 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 962 | "dev": true, 963 | "requires": { 964 | "emoji-regex": "^8.0.0", 965 | "is-fullwidth-code-point": "^3.0.0", 966 | "strip-ansi": "^6.0.0" 967 | }, 968 | "dependencies": { 969 | "strip-ansi": { 970 | "version": "6.0.0", 971 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 972 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 973 | "dev": true, 974 | "requires": { 975 | "ansi-regex": "^5.0.0" 976 | } 977 | } 978 | } 979 | }, 980 | "strip-ansi": { 981 | "version": "5.2.0", 982 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 983 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 984 | "dev": true, 985 | "requires": { 986 | "ansi-regex": "^4.1.0" 987 | }, 988 | "dependencies": { 989 | "ansi-regex": { 990 | "version": "4.1.0", 991 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 992 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 993 | "dev": true 994 | } 995 | } 996 | }, 997 | "strip-json-comments": { 998 | "version": "3.0.1", 999 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1000 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1001 | "dev": true 1002 | }, 1003 | "supports-color": { 1004 | "version": "5.5.0", 1005 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1006 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1007 | "dev": true, 1008 | "requires": { 1009 | "has-flag": "^3.0.0" 1010 | } 1011 | }, 1012 | "table": { 1013 | "version": "5.4.6", 1014 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1015 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1016 | "dev": true, 1017 | "requires": { 1018 | "ajv": "^6.10.2", 1019 | "lodash": "^4.17.14", 1020 | "slice-ansi": "^2.1.0", 1021 | "string-width": "^3.0.0" 1022 | }, 1023 | "dependencies": { 1024 | "emoji-regex": { 1025 | "version": "7.0.3", 1026 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1027 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1028 | "dev": true 1029 | }, 1030 | "is-fullwidth-code-point": { 1031 | "version": "2.0.0", 1032 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1033 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1034 | "dev": true 1035 | }, 1036 | "string-width": { 1037 | "version": "3.1.0", 1038 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1039 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1040 | "dev": true, 1041 | "requires": { 1042 | "emoji-regex": "^7.0.1", 1043 | "is-fullwidth-code-point": "^2.0.0", 1044 | "strip-ansi": "^5.1.0" 1045 | } 1046 | } 1047 | } 1048 | }, 1049 | "text-table": { 1050 | "version": "0.2.0", 1051 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1052 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1053 | "dev": true 1054 | }, 1055 | "through": { 1056 | "version": "2.3.8", 1057 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1058 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1059 | "dev": true 1060 | }, 1061 | "tmp": { 1062 | "version": "0.0.33", 1063 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1064 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1065 | "dev": true, 1066 | "requires": { 1067 | "os-tmpdir": "~1.0.2" 1068 | } 1069 | }, 1070 | "tslib": { 1071 | "version": "1.10.0", 1072 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1073 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1074 | "dev": true 1075 | }, 1076 | "tsutils": { 1077 | "version": "3.17.1", 1078 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 1079 | "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 1080 | "dev": true, 1081 | "requires": { 1082 | "tslib": "^1.8.1" 1083 | } 1084 | }, 1085 | "type-check": { 1086 | "version": "0.3.2", 1087 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1088 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1089 | "dev": true, 1090 | "requires": { 1091 | "prelude-ls": "~1.1.2" 1092 | } 1093 | }, 1094 | "type-fest": { 1095 | "version": "0.8.1", 1096 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1097 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1098 | "dev": true 1099 | }, 1100 | "typescript": { 1101 | "version": "3.7.5", 1102 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", 1103 | "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", 1104 | "dev": true 1105 | }, 1106 | "uri-js": { 1107 | "version": "4.2.2", 1108 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1109 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1110 | "dev": true, 1111 | "requires": { 1112 | "punycode": "^2.1.0" 1113 | } 1114 | }, 1115 | "v8-compile-cache": { 1116 | "version": "2.1.0", 1117 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1118 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1119 | "dev": true 1120 | }, 1121 | "which": { 1122 | "version": "1.3.1", 1123 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1124 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1125 | "dev": true, 1126 | "requires": { 1127 | "isexe": "^2.0.0" 1128 | } 1129 | }, 1130 | "word-wrap": { 1131 | "version": "1.2.3", 1132 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1133 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1134 | "dev": true 1135 | }, 1136 | "wrappy": { 1137 | "version": "1.0.2", 1138 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1139 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1140 | "dev": true 1141 | }, 1142 | "write": { 1143 | "version": "1.0.3", 1144 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1145 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1146 | "dev": true, 1147 | "requires": { 1148 | "mkdirp": "^0.5.1" 1149 | } 1150 | } 1151 | } 1152 | } 1153 | -------------------------------------------------------------------------------- /furoku-h/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "programming-typescript-furoku-h", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "devDependencies": { 6 | "@types/node": "^13.5.0", 7 | "@typescript-eslint/eslint-plugin": "^2.17.0", 8 | "@typescript-eslint/parser": "^2.17.0", 9 | "eslint": "^6.8.0", 10 | "eslint-config-prettier": "^6.9.0", 11 | "eslint-plugin-prettier": "^3.1.2", 12 | "prettier": "^1.19.1", 13 | "typescript": "^3.7.5" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /furoku-h/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ 6 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 7 | // "lib": [], /* Specify library files to be included in the compilation. */ 8 | // "allowJs": true, /* Allow javascript files to be compiled. */ 9 | // "checkJs": true, /* Report errors in .js files. */ 10 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 11 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 12 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 13 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 14 | // "outFile": "./", /* Concatenate and emit output to single file. */ 15 | // "outDir": "./", /* Redirect output structure to the directory. */ 16 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 17 | // "composite": true, /* Enable project compilation */ 18 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 19 | // "removeComments": true, /* Do not emit comments to output. */ 20 | // "noEmit": true, /* Do not emit outputs. */ 21 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 22 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 23 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 24 | 25 | /* Strict Type-Checking Options */ 26 | "strict": true, /* Enable all strict type-checking options. */ 27 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 28 | // "strictNullChecks": true, /* Enable strict null checks. */ 29 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 30 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 31 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 32 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 33 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 34 | 35 | /* Additional Checks */ 36 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 37 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 38 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 39 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 40 | 41 | /* Module Resolution Options */ 42 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 43 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 44 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 45 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 46 | // "typeRoots": [], /* List of folders to include type definitions from. */ 47 | // "types": [], /* Type declaration files to be included in compilation. */ 48 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 49 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 50 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 51 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 52 | 53 | /* Source Map Options */ 54 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 55 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 56 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 57 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 58 | 59 | /* Experimental Options */ 60 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 61 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 62 | 63 | /* Advanced Options */ 64 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /programming-typescript-ja.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oreilly-japan/programming-typescript-ja/7766b78eebe539e7a9a57e155753d5bcd0cc5a9a/programming-typescript-ja.png --------------------------------------------------------------------------------