From d6072b61682b3b00857042f30cf1186e0deee134 Mon Sep 17 00:00:00 2001 From: joshua1988 Date: Sun, 21 Jun 2020 16:14:43 +0900 Subject: [PATCH 01/13] before generics --- class-note/1_type-basic.ts | 30 +++++++++++++++ class-note/2_functions.ts | 23 +++++++++++ class-note/3_interface.ts | 68 +++++++++++++++++++++++++++++++++ class-note/4_type-aliases.ts | 22 +++++++++++ class-note/5_operator.ts | 35 +++++++++++++++++ class-note/6_enum.ts | 27 +++++++++++++ class-note/7_class.ts | 28 ++++++++++++++ class-note/class.js | 17 +++++++++ class-note/function.js | 5 +++ example/4_interfaces.ts | 41 +++++++++++++------- example/7_union-intersection.ts | 2 +- example/8_generics.ts | 17 +++++---- getting-started/index.js | 4 ++ getting-started/index.ts | 5 +++ getting-started/tsconfig.json | 7 ++++ quiz/1_todo/src/a.js | 12 ++++++ quiz/1_todo/src/index.ts | 48 ++++++++++++++++++----- quiz/1_todo/tsconfig.json | 2 +- why-ts/app.js | 54 ++++++++++++++++++++++++++ why-ts/index.html | 19 +++++++++ why-ts/sample.js | 18 +++++++++ why-ts/sample.ts | 8 ++++ 22 files changed, 458 insertions(+), 34 deletions(-) create mode 100644 class-note/1_type-basic.ts create mode 100644 class-note/2_functions.ts create mode 100644 class-note/3_interface.ts create mode 100644 class-note/4_type-aliases.ts create mode 100644 class-note/5_operator.ts create mode 100644 class-note/6_enum.ts create mode 100644 class-note/7_class.ts create mode 100644 class-note/class.js create mode 100644 class-note/function.js create mode 100644 getting-started/index.js create mode 100644 getting-started/index.ts create mode 100644 getting-started/tsconfig.json create mode 100644 quiz/1_todo/src/a.js create mode 100644 why-ts/app.js create mode 100644 why-ts/index.html create mode 100644 why-ts/sample.js create mode 100644 why-ts/sample.ts diff --git a/class-note/1_type-basic.ts b/class-note/1_type-basic.ts new file mode 100644 index 00000000..304569ee --- /dev/null +++ b/class-note/1_type-basic.ts @@ -0,0 +1,30 @@ +// JS 문자열 선언 +// var str = 'hello'; + +// TS 문자열 선언 +let str: string = 'hello'; + +// TS 숫자 +let num: number = 10; + +// TS 배열 +let arr: Array = [1,2,3]; +let heroes: Array = ['Capt', 'Thor', 'Hulk', 10] +let items: number[] = [1,2,3]; + +// TS 튜플 +let address: [string, number] = ['gangnam', 100]; + +// TS 객체 +let obj: object = {}; +// let person: object = { +// name: 'capt', +// age: 100 +// }; +let person: { name: string, age: number } = { + name: 'thor', + age: 1000 +} + +// TS 진위값 +let show: boolean = true; \ No newline at end of file diff --git a/class-note/2_functions.ts b/class-note/2_functions.ts new file mode 100644 index 00000000..aa44133b --- /dev/null +++ b/class-note/2_functions.ts @@ -0,0 +1,23 @@ +// 함수의 파라미터에 타입을 정의하는 방식 +// function sum(a: number, b: number) { +// return a + b; +// } +// sum(10, 20); + +// 함수의 반환 값에 타입을 정의하는 방식 +function add(): number { + return 10; +} + +// 함수에 타입을 정의하는 방식 +function sum(a: number, b: number): number { + return a + b; +} +sum(10); + +// 함수의 옵셔널 파라미터(?) +function log(a: string, b?: string) { + +} +log('hello world'); +log('hello ts', 'abc'); \ No newline at end of file diff --git a/class-note/3_interface.ts b/class-note/3_interface.ts new file mode 100644 index 00000000..24c6e99e --- /dev/null +++ b/class-note/3_interface.ts @@ -0,0 +1,68 @@ +interface User { + age: number; + name: string; +} + +// 변수에 인터페이스 활용 +var seho: User = { + age: 33, + name: '세호' +} + +// 함수에 인터페이스 활용 +function getUser(user: User) { + console.log(user); +} +const capt = { + name: '캡틴', + age: 100 +} +getUser(capt); + +// 함수의 스펙(구조)에 인터페이스를 활용 +interface SumFunction { + (a: number, b: number): number; +} + +var sum: SumFunction; +sum = function(a: number, b: number): number { + return a + b; +} + +// 인덱싱 +interface StringArray { + [index: number]: string; +} + +var arr: StringArray = ['a','b','c']; +// arr[0] = 10; + +// 딕셔너리 패턴 +interface StringRegexDictionary { + [key: string]: RegExp; +} + +var obj: StringRegexDictionary = { + // sth: /abc/, + cssFile: /\.css$/, + jsFile: /\.js$/, +} +// obj['cssFile'] = 'a' + +Object.keys(obj).forEach(function(value) {}); + +// 인터페이스 확장 +interface Person { + name: string; + age: number; +} + +interface Developer extends Person { + language: string; +} + +var captain: Developer = { + language: 'ts', + age: 100, + name: '캡틴' +} \ No newline at end of file diff --git a/class-note/4_type-aliases.ts b/class-note/4_type-aliases.ts new file mode 100644 index 00000000..5e57a307 --- /dev/null +++ b/class-note/4_type-aliases.ts @@ -0,0 +1,22 @@ +// interface Person { +// name: string; +// age: number; +// } + +type Person = { + name: string; + age: number; +} + +var seho: Person = { + name: '세호', + age: 30 +} + +type MyString = string; +var str: MyString = 'hello'; + +type Todo = { id: string; title: string; done: boolean }; +function getTodo(todo: Todo) { + +} \ No newline at end of file diff --git a/class-note/5_operator.ts b/class-note/5_operator.ts new file mode 100644 index 00000000..9c60ed30 --- /dev/null +++ b/class-note/5_operator.ts @@ -0,0 +1,35 @@ +// function logMessage(value: any) { +// console.log(value); +// } +// logMessage('hello'); +// logMessage(100); + +var seho: string | number | boolean; +function logMessage(value: string | number) { + if (typeof value === 'number') { + value.toLocaleString(); + } + if (typeof value === 'string') { + value.toString(); + } + throw new TypeError('value must be string or number'); +} +logMessage('hello'); +logMessage(100); + +// 인터섹션(교차) 타입 +interface Developer { + name: string; + skill: string; +} + +interface Person { + name: string; + age: number; +} + +function askSomeone(someone: Developer & Person) { + someone.name; + someone.age; + someone.skill; +} \ No newline at end of file diff --git a/class-note/6_enum.ts b/class-note/6_enum.ts new file mode 100644 index 00000000..0edff431 --- /dev/null +++ b/class-note/6_enum.ts @@ -0,0 +1,27 @@ +enum Shoes { + Nike = '나이키', + Adidas = '아디다스' +} + +var myShoes = Shoes.Nike; +console.log(myShoes); // '나이키' + +// 예제 +enum Answer { + Yes = 'Y', + No = 'N', +} + +function askQuestion(answer: Answer) { + if (answer === Answer.Yes) { + console.log('정답입니다'); + } + if (answer === Answer.No) { + console.log('오답입니다'); + } +} +askQuestion(Answer.Yes); +askQuestion('Yes'); +// askQuestion('예스'); +// askQuestion('y'); +// askQuestion('Yes'); \ No newline at end of file diff --git a/class-note/7_class.ts b/class-note/7_class.ts new file mode 100644 index 00000000..a6e4fd9a --- /dev/null +++ b/class-note/7_class.ts @@ -0,0 +1,28 @@ +class Person { + private name: string; + public age: number; + readonly log: string; + + constructor(name: string, age: number) { + this.name = name; + this.age = age; + } +} + +// 리액트 예전 문법 - 클래스 기반 코드 +class App extends React.Component { + +} + +// 리액트 최신 문법 - 훅 기반의 함수형 코드 +function App() { + return
Hello World
+} + +// +new Vue({ + el: '', + setup() { + + } +}) \ No newline at end of file diff --git a/class-note/class.js b/class-note/class.js new file mode 100644 index 00000000..54e4df44 --- /dev/null +++ b/class-note/class.js @@ -0,0 +1,17 @@ +function Person(name, age) { + this.name = name; + this.age = age; +} +var capt = new Person('캡틴', 100); + +class Person { + // 클래스 로직 + constructor(name, age) { + console.log('생성 되었습니다'); + this.name = name; + this.age = age; + } +} + +var seho = new Person('세호', 30); // 생성 되었습니다. +console.log(seho); \ No newline at end of file diff --git a/class-note/function.js b/class-note/function.js new file mode 100644 index 00000000..03607ad4 --- /dev/null +++ b/class-note/function.js @@ -0,0 +1,5 @@ +function sum(a, b) { + return a + b; +} + +sum(10, 20, 30, 40, 50); \ No newline at end of file diff --git a/example/4_interfaces.ts b/example/4_interfaces.ts index bf087215..7a753d14 100644 --- a/example/4_interfaces.ts +++ b/example/4_interfaces.ts @@ -5,7 +5,7 @@ interface User { } // 변수에 사용하는 경우 -const seho: User = { name: 'hi', age: 100 }; +const seho: User = { name: '세호', age: 100 }; // 함수의 매개변수에 사용하는 경우 function getUser(user: User) { @@ -14,21 +14,34 @@ function getUser(user: User) { getUser(seho); // 함수의 전체 타입에 사용하는 경우 -// interface SumFunction { -// (a: number, b: number): number; -// } -// let sum: SumFunction; -// sum = function (num1: number, num2: string): number { -// return num1 + num2; -// }; +interface SumFunction { + (a: number, b: number): number; +} +let sum: SumFunction; +sum = function (num1: number, num2: string): number { + return num1 + num2; +}; // 배열의 인덱싱에 사용하는 경우 -// interface StringArray { -// [index: number]: string; -// } -// let arr: StringArray; -// arr[0] = 'hi'; -// arr[1] = 10; +interface StringArray { + [index: number]: string; +} +let arr: StringArray; +arr[0] = 'hi'; +arr[1] = 10; + +// 딕셔너리 패턴 +interface StringRegexDictionary { + [key: string]: RegExp; +} + +const regexMap: StringRegexDictionary = { + cssFile: /\.css$/, + jsFile: /\.js$/, +}; + +Object.keys(regexMap).forEach(function(value) { +}) // 인터페이스 확장 interface Person { diff --git a/example/7_union-intersection.ts b/example/7_union-intersection.ts index 47dcd1ca..171e3c20 100644 --- a/example/7_union-intersection.ts +++ b/example/7_union-intersection.ts @@ -37,4 +37,4 @@ interface Person { function askSomeone(someone: Developer | Person) { someone.name; // O someone.age; // X -} \ No newline at end of file +} diff --git a/example/8_generics.ts b/example/8_generics.ts index 636bc786..3b5de8be 100644 --- a/example/8_generics.ts +++ b/example/8_generics.ts @@ -39,14 +39,15 @@ interface ShoppingItems { stock: number; } function getAllowedOptions(option: T): T { - if (option === 'name' || option === 'address') { - console.log('option type is string'); - return option; - } - if (option === 'price' || option === 'stock') { - console.log('option type is number'); - return option; - } + return option; + // if (option === 'name' || option === 'address') { + // console.log('option type is string'); + // return option; + // } + // if (option === 'price' || option === 'stock') { + // console.log('option type is number'); + // return option; + // } } getAllowedOptions('nothing'); // const a = getAllowedOptions('name'); diff --git a/getting-started/index.js b/getting-started/index.js new file mode 100644 index 00000000..7353c52e --- /dev/null +++ b/getting-started/index.js @@ -0,0 +1,4 @@ +function sum(a, b) { + return a + b; +} +sum(10, 20); diff --git a/getting-started/index.ts b/getting-started/index.ts new file mode 100644 index 00000000..b61aa437 --- /dev/null +++ b/getting-started/index.ts @@ -0,0 +1,5 @@ +function sum(a: number, b: number): number { + return a + b; +} + +sum(10, 20); diff --git a/getting-started/tsconfig.json b/getting-started/tsconfig.json new file mode 100644 index 00000000..245154fb --- /dev/null +++ b/getting-started/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noImplicitAny": true + } +} diff --git a/quiz/1_todo/src/a.js b/quiz/1_todo/src/a.js new file mode 100644 index 00000000..4daca074 --- /dev/null +++ b/quiz/1_todo/src/a.js @@ -0,0 +1,12 @@ +let arr = [ + { gender: 'male', name: 'john' }, + { gender: 'female', name: 'sarah' }, + { gender: 'male', name: 'bone' }, +]; + +let filtered = arr.filter(function (item) { + if (item.gender === 'female') { + return item; + } +}); +console.log(filtered); diff --git a/quiz/1_todo/src/index.ts b/quiz/1_todo/src/index.ts index a4186753..d69a6631 100644 --- a/quiz/1_todo/src/index.ts +++ b/quiz/1_todo/src/index.ts @@ -1,7 +1,19 @@ -let todoItems; +// type Todo = { +// id: number; +// title: string; +// done: boolean; +// }; + +interface Todo { + id: number; + title: string; + done: boolean; +} + +let todoItems: Todo[]; // api -function fetchTodoItems() { +function fetchTodoItems(): Todo[] { const todos = [ { id: 1, title: '안녕', done: false }, { id: 2, title: '타입', done: false }, @@ -11,40 +23,56 @@ function fetchTodoItems() { } // crud methods -function fetchTodos() { +function fetchTodos(): object[] { const todos = fetchTodoItems(); return todos; } -function addTodo(todo) { +function addTodo(todo: Todo): void { todoItems.push(todo); } -function deleteTodo(index) { +function deleteTodo(index: number): void { todoItems.splice(index, 1); } -function completeTodo(index, todo) { +function completeTodo(index: number, todo: Todo): void { todo.done = true; todoItems.splice(index, 1, todo); } // business logic -function logFirstTodo() { +function logFirstTodo(): object { return todoItems[0]; } -function showCompleted() { +function showCompleted(): object[] { return todoItems.filter(item => item.done); + // return todoItems.filter(function(item) { + // if (item.done) { + // return item;` + // } + // }); } // TODO: 아래 함수의 내용을 채워보세요. 아래 함수는 `addTodo()` 함수를 이용하여 2개의 새 할 일을 추가하는 함수입니다. -function addTwoTodoItems() { +function addTwoTodoItems(): void { // addTodo() 함수를 두 번 호출하여 todoItems에 새 할 일이 2개 추가되어야 합니다. + const item1 = { + id: 4, + title: '아이템 4', + done: false, + }; + addTodo(item1); + addTodo({ + id: 5, + title: '아이템 5', + done: false, + }); } // NOTE: 유틸 함수 -function log() { +function log(): void { console.log(todoItems); } diff --git a/quiz/1_todo/tsconfig.json b/quiz/1_todo/tsconfig.json index 24f4d43d..65c6381f 100644 --- a/quiz/1_todo/tsconfig.json +++ b/quiz/1_todo/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "allowJs": true, "checkJs": true, - "noImplicitAny": false + "noImplicitAny": true }, "include": ["./src/**/*"] } diff --git a/why-ts/app.js b/why-ts/app.js new file mode 100644 index 00000000..ebc64928 --- /dev/null +++ b/why-ts/app.js @@ -0,0 +1,54 @@ +// api url +var url = 'https://jsonplaceholder.typicode.com/users/1'; + +// dom +var username = document.querySelector('#username'); +var email = document.querySelector('#email'); +var address = document.querySelector('#address'); + +// user data +var user = {}; + +/** + * @typedef {object} Address + * @property {string} street + * @property {string} city + */ + +/** + * @typedef {object} User + * @property {string} name + * @property {string} email + * @property {Address} address + */ + +/** + * @returns {Promise} + */ +function fetchUser() { + return axios.get(url); +} + +fetchUser().then(function (response) { + response.address.cit; +}); + +function startApp() { + // axios + // .get(url) + fetchUser() + .then(function (response) { + // console.log(response); + user = response.data; + // TODO: 이름, 이메일, 주소 표시하기 + console.log(user); + username.innerText = user[0].name; + email.innerText = user[0].email; + address.innerText = user[0].addres.street; + }) + .catch(function (error) { + console.log(error); + }); +} + +startApp(); diff --git a/why-ts/index.html b/why-ts/index.html new file mode 100644 index 00000000..9545784f --- /dev/null +++ b/why-ts/index.html @@ -0,0 +1,19 @@ + + + + + + Why Typescript? + + +

사용자 정보

+
+

이름:

+

이메일:

+

주소:

+
+ + + + + diff --git a/why-ts/sample.js b/why-ts/sample.js new file mode 100644 index 00000000..30542479 --- /dev/null +++ b/why-ts/sample.js @@ -0,0 +1,18 @@ +// function sum(a, b) { +// return a + b; +// } +// // sum(10, '20'); // 1020 +// var result = sum(10, 20); +// result.toLocalestring(); + +// @ts-check + +/** + * + * @param {number} a 첫번째 숫자 + * @param {number} b 두번째 숫자 + */ +function sum(a, b) { + return a + b; +} +sum(10, '20'); diff --git a/why-ts/sample.ts b/why-ts/sample.ts new file mode 100644 index 00000000..ed3ed29f --- /dev/null +++ b/why-ts/sample.ts @@ -0,0 +1,8 @@ +function add(a: number, b: number): number { + return a + b; +} +var result = add(10, 20); +// result.toLocaleString(); +result.toLocaleString(); + +// add(10, '20'); From e6064761614c857ef75056be62775f13dae84c4a Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Mon, 5 Oct 2020 11:45:18 +0900 Subject: [PATCH 02/13] from generic to quiz 2 solution --- class-note/8_generics.ts | 95 +++++++++++++++++++++++++++++++ example/8_generics.ts | 2 +- example/dropdown-generic.html | 26 +++++++++ example/dropdown-generic.ts | 50 ++++++++++++++++ quiz/2_address-book/.eslintrc.js | 4 +- quiz/2_address-book/src/a.ts | 14 +++++ quiz/2_address-book/src/index.ts | 36 ++++++++---- quiz/2_address-book/tsconfig.json | 4 +- 8 files changed, 217 insertions(+), 14 deletions(-) create mode 100644 class-note/8_generics.ts create mode 100644 example/dropdown-generic.html create mode 100644 example/dropdown-generic.ts create mode 100644 quiz/2_address-book/src/a.ts diff --git a/class-note/8_generics.ts b/class-note/8_generics.ts new file mode 100644 index 00000000..2d02a481 --- /dev/null +++ b/class-note/8_generics.ts @@ -0,0 +1,95 @@ +// function logText(text) { +// console.log(text); +// return text; +// } +// logText(10); // 숫자 10 +// logText('하이'); // 문자열 하이 +// logText(true); // 진위값 true + +// function logText(text: T): T { +// console.log(text); +// return text; +// } +// logText('하이'); + +// function logText(text: string) { +// console.log(text); +// // text.split('').reverse().join(''); +// return text; +// } + +// function logNumber(num: number) { +// console.log(num); +// return num; +// } + +// function logText(text: string | number) { +// console.log(text); +// return text; +// } + +// const a = logText('a'); +// logText(10); +// const num = logNumber(10); +// logText(true); + +function logText(text: T): T { + console.log(text); + return text; +} + +// const str = logText('abc'); +// str.split(''); +// const login = logText(true); + +// logText('a') +// logText(10) + +// 인터페이스에 제네릭을 선언하는 방법 +// interface Dropdown { +// value: string; +// selected: boolean; +// } + +// const obj: Dropdown = { value: 'abc', selected: false }; + +interface Dropdown { + value: T; + selected: boolean; +} +const obj: Dropdown = { value: 'abc', selected: false }; + +// 제네릭 타입 제한 +// function logTextLength(text: T[]): T[] { +// console.log(text.length); +// text.forEach(function (text) { +// console.log(text); +// }); +// return text; +// } +// logTextLength(['hi', 'abc']); + +// 제네릭 타입 제한 2 - 정의된 타입 이용하기 +interface LengthType { + length: number; +} +function logTextLength(text: T): T { + text.length; + return text; +} +logTextLength(10); +logTextLength({ leng: 10 }); + +// 제네릭 타입 제한 3 - keyof +interface ShoppingItem { + name: string; + price: number; + stock: number; +} + +function getShoppingItemOption(itemOption: T): T { + return itemOption; +} +// getShoppingItemOption(10); +// getShoppingItemOption('a'); +getShoppingItemOption('name'); diff --git a/example/8_generics.ts b/example/8_generics.ts index 3b5de8be..c98f24da 100644 --- a/example/8_generics.ts +++ b/example/8_generics.ts @@ -51,4 +51,4 @@ function getAllowedOptions(option: T): T { } getAllowedOptions('nothing'); // const a = getAllowedOptions('name'); -// a.toUpperCase(); // Name \ No newline at end of file +// a.toUpperCase(); // Name diff --git a/example/dropdown-generic.html b/example/dropdown-generic.html new file mode 100644 index 00000000..a21297b0 --- /dev/null +++ b/example/dropdown-generic.html @@ -0,0 +1,26 @@ + + + + + + Document + + +
+

이메일 선택 드롭다운

+ +
+
+

상품 수량 선택 드롭다운

+ +
+ + diff --git a/example/dropdown-generic.ts b/example/dropdown-generic.ts new file mode 100644 index 00000000..fbca5888 --- /dev/null +++ b/example/dropdown-generic.ts @@ -0,0 +1,50 @@ +interface DropdownItem { + value: T; + selected: boolean; +} + +// interface Email { +// value: string; +// selected: boolean; +// } + +const emails: DropdownItem[] = [ + { value: 'naver.com', selected: true }, + { value: 'gmail.com', selected: false }, + { value: 'hanmail.net', selected: false }, +]; + +// interface ProductNumber { +// value: number; +// selected: boolean; +// } + +// interface TrueFalse { +// value: boolean; +// selected: boolean; +// } + +const numberOfProducts: DropdownItem[] = [ + { value: 1, selected: true }, + { value: 2, selected: false }, + { value: 3, selected: false }, +]; + +function createDropdownItem(item: DropdownItem | DropdownItem) { + const option = document.createElement('option'); + option.value = item.value.toString(); + option.innerText = item.value.toString(); + option.selected = item.selected; + return option; +} + +// NOTE: 이메일 드롭 다운 아이템 추가 +emails.forEach(function (email) { + const item = createDropdownItem(email); + const selectTag = document.querySelector('#email-dropdown'); + selectTag.appendChild(item); +}); + +numberOfProducts.forEach(function (product) { + const item = createDropdownItem(product); +}); diff --git a/quiz/2_address-book/.eslintrc.js b/quiz/2_address-book/.eslintrc.js index 282cb6bc..d5747525 100644 --- a/quiz/2_address-book/.eslintrc.js +++ b/quiz/2_address-book/.eslintrc.js @@ -23,8 +23,8 @@ module.exports = { arrowParens: 'avoid', }, ], - '@typescript-eslint/no-explicit-any': 'off', - "@typescript-eslint/explicit-function-return-type": 'off', + // '@typescript-eslint/no-explicit-any': 'off', + // "@typescript-eslint/explicit-function-return-type": 'off', 'prefer-const': 'off', }, parserOptions: { diff --git a/quiz/2_address-book/src/a.ts b/quiz/2_address-book/src/a.ts new file mode 100644 index 00000000..85b471d5 --- /dev/null +++ b/quiz/2_address-book/src/a.ts @@ -0,0 +1,14 @@ +// function fetchItems() { +// let items = ['a', 'b', 'c']; +// return items; +// } +// let result = fetchItems(); +// console.log(result); + +function fetchItems(): Promise { + let items: string[] = ['a', 'b', 'c']; + return new Promise(function (resolve) { + resolve(items); + }); +} +fetchItems(); diff --git a/quiz/2_address-book/src/index.ts b/quiz/2_address-book/src/index.ts index 7ee67ba9..67e4ca2c 100644 --- a/quiz/2_address-book/src/index.ts +++ b/quiz/2_address-book/src/index.ts @@ -10,11 +10,17 @@ interface Contact { phones: PhoneNumberDictionary; } +enum PhoneType { + Home = 'home', + Office = 'office', + Studio = 'studio', +} + // api // TODO: 아래 함수의 반환 타입을 지정해보세요. -function fetchContacts() { +function fetchContacts(): Promise { // TODO: 아래 변수의 타입을 지정해보세요. - const contacts = [ + const contacts: Contact[] = [ { name: 'Tony', address: 'Malibu', @@ -57,45 +63,55 @@ function fetchContacts() { // main class AddressBook { // TODO: 아래 변수의 타입을 지정해보세요. - contacts = []; + contacts: Contact[] = []; constructor() { this.fetchData(); } - fetchData() { + fetchData(): void { fetchContacts().then(response => { this.contacts = response; }); } /* TODO: 아래 함수들의 파라미터 타입과 반환 타입을 지정해보세요 */ - findContactByName(name) { + findContactByName(name: string): Contact[] { return this.contacts.filter(contact => contact.name === name); } - findContactByAddress(address) { + findContactByAddress(address: string): Contact[] { return this.contacts.filter(contact => contact.address === address); } - findContactByPhone(phoneNumber, phoneType: string) { + // home, office, studio + findContactByPhone(phoneNumber: number, phoneType: PhoneType): Contact[] { return this.contacts.filter( contact => contact.phones[phoneType].num === phoneNumber ); } + // findContactByPhone('officce'); - addContact(contact) { + addContact(contact: Contact): void { this.contacts.push(contact); } - displayListByName() { + displayListByName(): string[] { return this.contacts.map(contact => contact.name); } - displayListByAddress() { + displayListByAddress(): string[] { return this.contacts.map(contact => contact.address); } /* ------------------------------------------------ */ } +// let heroes = [ +// { name: 'Tony', age: 30 }, +// { name: 'Captain', age: 100 }, +// ]; +// heroes.map(function (hero) { +// return hero.name; +// }); // ['Tony', 'Captain'] + new AddressBook(); diff --git a/quiz/2_address-book/tsconfig.json b/quiz/2_address-book/tsconfig.json index 671b504e..f75e2b36 100644 --- a/quiz/2_address-book/tsconfig.json +++ b/quiz/2_address-book/tsconfig.json @@ -4,7 +4,9 @@ "checkJs": true, "target": "es5", "lib": ["es2015", "dom", "dom.iterable"], - "noImplicitAny": false + "noImplicitAny": true, + "strict": true, + "strictFunctionTypes": true }, "include": ["./src/**/*"] } From b95e0ee0512b9aa9764690d483b0d1a593846c77 Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Sun, 18 Oct 2020 18:48:59 +0900 Subject: [PATCH 03/13] til type-compatilibity --- class-note/10_type-assertion.ts | 13 +++++++++ class-note/11_type-guard.ts | 34 ++++++++++++++++++++++ class-note/12_type-compatibility.ts | 45 +++++++++++++++++++++++++++++ class-note/9_type-inference.ts | 39 +++++++++++++++++++++++++ class-note/ts-modules/app.ts | 6 ++++ class-note/ts-modules/types.ts | 4 +++ example/9_type-inference.ts | 26 +++++++++++++++++ example/type-comp.ts | 30 +++++++++++++++++++ quiz/2_address-book/src/index.ts | 21 +++----------- quiz/2_address-book/src/types.ts | 19 ++++++++++++ 10 files changed, 220 insertions(+), 17 deletions(-) create mode 100644 class-note/10_type-assertion.ts create mode 100644 class-note/11_type-guard.ts create mode 100644 class-note/12_type-compatibility.ts create mode 100644 class-note/9_type-inference.ts create mode 100644 class-note/ts-modules/app.ts create mode 100644 class-note/ts-modules/types.ts create mode 100644 example/9_type-inference.ts create mode 100644 example/type-comp.ts create mode 100644 quiz/2_address-book/src/types.ts diff --git a/class-note/10_type-assertion.ts b/class-note/10_type-assertion.ts new file mode 100644 index 00000000..04119cba --- /dev/null +++ b/class-note/10_type-assertion.ts @@ -0,0 +1,13 @@ +// 타입 단언(type assertion) +var a; +a = 20; +a = 'a' +var b = a as string; + +// DOM API 조작 +//
hi
+ +var div = document.querySelector('div'); +if (div) { + div.innerText +} \ No newline at end of file diff --git a/class-note/11_type-guard.ts b/class-note/11_type-guard.ts new file mode 100644 index 00000000..23c25116 --- /dev/null +++ b/class-note/11_type-guard.ts @@ -0,0 +1,34 @@ +interface Developer { + name: string; + skill: string; +} + +interface Person { + name: string; + age: number; +} + +function introduce(): Developer | Person { + return { name: 'Tony', age: 33, skill: 'Iron Making' } +} +var tony = introduce(); +console.log(tony.skill); + +if ((tony as Developer).skill) { + var skill = (tony as Developer).skill; + console.log(skill); +} else if ((tony as Person).age) { + var age = (tony as Person).age; + console.log(age); +} + +// 타입 가드 정의 +function isDeveloper(target: Developer | Person): target is Developer { + return (target as Developer).skill !== undefined; +} + +if (isDeveloper(tony)) { + console.log(tony.skill); +} else { + console.log(tony.age); +} \ No newline at end of file diff --git a/class-note/12_type-compatibility.ts b/class-note/12_type-compatibility.ts new file mode 100644 index 00000000..1e07d5e7 --- /dev/null +++ b/class-note/12_type-compatibility.ts @@ -0,0 +1,45 @@ +// 인터페이스 +interface Developer { + name: string; + skill: string; +} +// interface Person { +// name: string; +// // skill: string; +// } +class Person { + name: string; + skill: string; +} + +var developer: Developer; +var person: Person; +developer = new Person(); +// person = developer; + +// 함수 +var add = function(a: number) { + // ... +} +var sum = function(a: number, b: number) { + // ... +} +sum = add; +// add = sum; + +// 제네릭 +interface Empty { + // .. +} +var empty1: Empty; +var empty2: Empty; +empty1 = empty2; +empty2 = empty1; + +interface NotEmpty { + data: T; +} +var notempty1: NotEmpty; +var notempty2: NotEmpty; +notempty1 = notempty2; +notempty2 = notempty1; \ No newline at end of file diff --git a/class-note/9_type-inference.ts b/class-note/9_type-inference.ts new file mode 100644 index 00000000..3a12f99f --- /dev/null +++ b/class-note/9_type-inference.ts @@ -0,0 +1,39 @@ +// 타입 추론 기본 1 +var a = 'abc'; + +function getB(b = 10) { + var c = 'hi'; + return b + c; +} + +10 + '10'; // 1010 + +// 타입 추론 기본 2 +// interface Dropdown { +// value: T; +// title: string; +// } +// var shoppingItem: Dropdown = { +// value: 'abc', +// title: 'hello' +// } + +// 타입 추론 기본 3 +interface Dropdown { + value: T; + title: string; +} +interface DetailedDropdown extends Dropdown { + description: string; + tag: K; +} + +var detailedItem: DetailedDropdown = { + title: 'abc', + description: 'ab', + value: 'a', + tag: 'a', +}; + +// Best Common Type +var arr = [1, 2, true, true, 'a']; diff --git a/class-note/ts-modules/app.ts b/class-note/ts-modules/app.ts new file mode 100644 index 00000000..fb21cc25 --- /dev/null +++ b/class-note/ts-modules/app.ts @@ -0,0 +1,6 @@ +import { Todo } from './types' + +var item: Todo = { + title: '할 일 1', + checked: false, +} \ No newline at end of file diff --git a/class-note/ts-modules/types.ts b/class-note/ts-modules/types.ts new file mode 100644 index 00000000..338f2d89 --- /dev/null +++ b/class-note/ts-modules/types.ts @@ -0,0 +1,4 @@ +export interface Todo { + title: string; + checked: boolean; +} diff --git a/example/9_type-inference.ts b/example/9_type-inference.ts new file mode 100644 index 00000000..9e47543c --- /dev/null +++ b/example/9_type-inference.ts @@ -0,0 +1,26 @@ +var a = 'a'; + +function logA(a = 'a') { + var b = 10; + return b; +} + +interface Dropdown { + value: T + title: string; +} +var items: Dropdown = { + value: 10, + title: 'a' +} + +interface DetailedDropdown extends Dropdown { + description: string; + tag: T; +} +var detailItems: DetailedDropdown = { + value: 'hi', + title: 'a', + description: 'b', + tag: 'c' +} \ No newline at end of file diff --git a/example/type-comp.ts b/example/type-comp.ts new file mode 100644 index 00000000..73156855 --- /dev/null +++ b/example/type-comp.ts @@ -0,0 +1,30 @@ +// 인터페이스 +interface Developer { + name: string; + skill: string; +} + +interface Person { + name: string; +} + +var a: Developer; +var b: Person; +// a = b; // X +b = a; // O + +// 함수 +var add = function(a: number) { + // ... +} +var sum = function(a: number, b: number) { + // ... +} +// sum = add; // X +// add = sum; // O + +// // 유니온 타입 +// var c: Developer | Person; +// var d: Person | string; +// c = d; +// d = c; \ No newline at end of file diff --git a/quiz/2_address-book/src/index.ts b/quiz/2_address-book/src/index.ts index 67e4ca2c..54bb40d8 100644 --- a/quiz/2_address-book/src/index.ts +++ b/quiz/2_address-book/src/index.ts @@ -1,20 +1,4 @@ -interface PhoneNumberDictionary { - [phone: string]: { - num: number; - }; -} - -interface Contact { - name: string; - address: string; - phones: PhoneNumberDictionary; -} - -enum PhoneType { - Home = 'home', - Office = 'office', - Studio = 'studio', -} +import { Contact, PhoneType } from './types'; // api // TODO: 아래 함수의 반환 타입을 지정해보세요. @@ -106,6 +90,9 @@ class AddressBook { /* ------------------------------------------------ */ } +let div = document.querySelector('.container') as HTMLDivElement; +div.innerText; + // let heroes = [ // { name: 'Tony', age: 30 }, // { name: 'Captain', age: 100 }, diff --git a/quiz/2_address-book/src/types.ts b/quiz/2_address-book/src/types.ts new file mode 100644 index 00000000..4913f520 --- /dev/null +++ b/quiz/2_address-book/src/types.ts @@ -0,0 +1,19 @@ +interface PhoneNumberDictionary { + [phone: string]: { + num: number; + }; +} + +interface Contact { + name: string; + address: string; + phones: PhoneNumberDictionary; +} + +enum PhoneType { + Home = 'home', + Office = 'office', + Studio = 'studio', +} + +export { Contact, PhoneType }; From 6d496cef17e0695a70864e1a58eb140eca350f2b Mon Sep 17 00:00:00 2001 From: joshua1988 Date: Sun, 21 Jun 2020 16:14:43 +0900 Subject: [PATCH 04/13] before generics --- class-note/1_type-basic.ts | 30 +++++++++++++++ class-note/2_functions.ts | 23 +++++++++++ class-note/3_interface.ts | 68 +++++++++++++++++++++++++++++++++ class-note/4_type-aliases.ts | 22 +++++++++++ class-note/5_operator.ts | 35 +++++++++++++++++ class-note/6_enum.ts | 27 +++++++++++++ class-note/7_class.ts | 28 ++++++++++++++ class-note/class.js | 17 +++++++++ class-note/function.js | 5 +++ example/4_interfaces.ts | 41 +++++++++++++------- example/7_union-intersection.ts | 2 +- example/8_generics.ts | 17 +++++---- getting-started/index.js | 4 ++ getting-started/index.ts | 5 +++ getting-started/tsconfig.json | 7 ++++ quiz/1_todo/src/a.js | 12 ++++++ quiz/1_todo/src/index.ts | 48 ++++++++++++++++++----- quiz/1_todo/tsconfig.json | 2 +- why-ts/app.js | 54 ++++++++++++++++++++++++++ why-ts/index.html | 19 +++++++++ why-ts/sample.js | 18 +++++++++ why-ts/sample.ts | 8 ++++ 22 files changed, 458 insertions(+), 34 deletions(-) create mode 100644 class-note/1_type-basic.ts create mode 100644 class-note/2_functions.ts create mode 100644 class-note/3_interface.ts create mode 100644 class-note/4_type-aliases.ts create mode 100644 class-note/5_operator.ts create mode 100644 class-note/6_enum.ts create mode 100644 class-note/7_class.ts create mode 100644 class-note/class.js create mode 100644 class-note/function.js create mode 100644 getting-started/index.js create mode 100644 getting-started/index.ts create mode 100644 getting-started/tsconfig.json create mode 100644 quiz/1_todo/src/a.js create mode 100644 why-ts/app.js create mode 100644 why-ts/index.html create mode 100644 why-ts/sample.js create mode 100644 why-ts/sample.ts diff --git a/class-note/1_type-basic.ts b/class-note/1_type-basic.ts new file mode 100644 index 00000000..304569ee --- /dev/null +++ b/class-note/1_type-basic.ts @@ -0,0 +1,30 @@ +// JS 문자열 선언 +// var str = 'hello'; + +// TS 문자열 선언 +let str: string = 'hello'; + +// TS 숫자 +let num: number = 10; + +// TS 배열 +let arr: Array = [1,2,3]; +let heroes: Array = ['Capt', 'Thor', 'Hulk', 10] +let items: number[] = [1,2,3]; + +// TS 튜플 +let address: [string, number] = ['gangnam', 100]; + +// TS 객체 +let obj: object = {}; +// let person: object = { +// name: 'capt', +// age: 100 +// }; +let person: { name: string, age: number } = { + name: 'thor', + age: 1000 +} + +// TS 진위값 +let show: boolean = true; \ No newline at end of file diff --git a/class-note/2_functions.ts b/class-note/2_functions.ts new file mode 100644 index 00000000..aa44133b --- /dev/null +++ b/class-note/2_functions.ts @@ -0,0 +1,23 @@ +// 함수의 파라미터에 타입을 정의하는 방식 +// function sum(a: number, b: number) { +// return a + b; +// } +// sum(10, 20); + +// 함수의 반환 값에 타입을 정의하는 방식 +function add(): number { + return 10; +} + +// 함수에 타입을 정의하는 방식 +function sum(a: number, b: number): number { + return a + b; +} +sum(10); + +// 함수의 옵셔널 파라미터(?) +function log(a: string, b?: string) { + +} +log('hello world'); +log('hello ts', 'abc'); \ No newline at end of file diff --git a/class-note/3_interface.ts b/class-note/3_interface.ts new file mode 100644 index 00000000..24c6e99e --- /dev/null +++ b/class-note/3_interface.ts @@ -0,0 +1,68 @@ +interface User { + age: number; + name: string; +} + +// 변수에 인터페이스 활용 +var seho: User = { + age: 33, + name: '세호' +} + +// 함수에 인터페이스 활용 +function getUser(user: User) { + console.log(user); +} +const capt = { + name: '캡틴', + age: 100 +} +getUser(capt); + +// 함수의 스펙(구조)에 인터페이스를 활용 +interface SumFunction { + (a: number, b: number): number; +} + +var sum: SumFunction; +sum = function(a: number, b: number): number { + return a + b; +} + +// 인덱싱 +interface StringArray { + [index: number]: string; +} + +var arr: StringArray = ['a','b','c']; +// arr[0] = 10; + +// 딕셔너리 패턴 +interface StringRegexDictionary { + [key: string]: RegExp; +} + +var obj: StringRegexDictionary = { + // sth: /abc/, + cssFile: /\.css$/, + jsFile: /\.js$/, +} +// obj['cssFile'] = 'a' + +Object.keys(obj).forEach(function(value) {}); + +// 인터페이스 확장 +interface Person { + name: string; + age: number; +} + +interface Developer extends Person { + language: string; +} + +var captain: Developer = { + language: 'ts', + age: 100, + name: '캡틴' +} \ No newline at end of file diff --git a/class-note/4_type-aliases.ts b/class-note/4_type-aliases.ts new file mode 100644 index 00000000..5e57a307 --- /dev/null +++ b/class-note/4_type-aliases.ts @@ -0,0 +1,22 @@ +// interface Person { +// name: string; +// age: number; +// } + +type Person = { + name: string; + age: number; +} + +var seho: Person = { + name: '세호', + age: 30 +} + +type MyString = string; +var str: MyString = 'hello'; + +type Todo = { id: string; title: string; done: boolean }; +function getTodo(todo: Todo) { + +} \ No newline at end of file diff --git a/class-note/5_operator.ts b/class-note/5_operator.ts new file mode 100644 index 00000000..9c60ed30 --- /dev/null +++ b/class-note/5_operator.ts @@ -0,0 +1,35 @@ +// function logMessage(value: any) { +// console.log(value); +// } +// logMessage('hello'); +// logMessage(100); + +var seho: string | number | boolean; +function logMessage(value: string | number) { + if (typeof value === 'number') { + value.toLocaleString(); + } + if (typeof value === 'string') { + value.toString(); + } + throw new TypeError('value must be string or number'); +} +logMessage('hello'); +logMessage(100); + +// 인터섹션(교차) 타입 +interface Developer { + name: string; + skill: string; +} + +interface Person { + name: string; + age: number; +} + +function askSomeone(someone: Developer & Person) { + someone.name; + someone.age; + someone.skill; +} \ No newline at end of file diff --git a/class-note/6_enum.ts b/class-note/6_enum.ts new file mode 100644 index 00000000..0edff431 --- /dev/null +++ b/class-note/6_enum.ts @@ -0,0 +1,27 @@ +enum Shoes { + Nike = '나이키', + Adidas = '아디다스' +} + +var myShoes = Shoes.Nike; +console.log(myShoes); // '나이키' + +// 예제 +enum Answer { + Yes = 'Y', + No = 'N', +} + +function askQuestion(answer: Answer) { + if (answer === Answer.Yes) { + console.log('정답입니다'); + } + if (answer === Answer.No) { + console.log('오답입니다'); + } +} +askQuestion(Answer.Yes); +askQuestion('Yes'); +// askQuestion('예스'); +// askQuestion('y'); +// askQuestion('Yes'); \ No newline at end of file diff --git a/class-note/7_class.ts b/class-note/7_class.ts new file mode 100644 index 00000000..a6e4fd9a --- /dev/null +++ b/class-note/7_class.ts @@ -0,0 +1,28 @@ +class Person { + private name: string; + public age: number; + readonly log: string; + + constructor(name: string, age: number) { + this.name = name; + this.age = age; + } +} + +// 리액트 예전 문법 - 클래스 기반 코드 +class App extends React.Component { + +} + +// 리액트 최신 문법 - 훅 기반의 함수형 코드 +function App() { + return
Hello World
+} + +// +new Vue({ + el: '', + setup() { + + } +}) \ No newline at end of file diff --git a/class-note/class.js b/class-note/class.js new file mode 100644 index 00000000..54e4df44 --- /dev/null +++ b/class-note/class.js @@ -0,0 +1,17 @@ +function Person(name, age) { + this.name = name; + this.age = age; +} +var capt = new Person('캡틴', 100); + +class Person { + // 클래스 로직 + constructor(name, age) { + console.log('생성 되었습니다'); + this.name = name; + this.age = age; + } +} + +var seho = new Person('세호', 30); // 생성 되었습니다. +console.log(seho); \ No newline at end of file diff --git a/class-note/function.js b/class-note/function.js new file mode 100644 index 00000000..03607ad4 --- /dev/null +++ b/class-note/function.js @@ -0,0 +1,5 @@ +function sum(a, b) { + return a + b; +} + +sum(10, 20, 30, 40, 50); \ No newline at end of file diff --git a/example/4_interfaces.ts b/example/4_interfaces.ts index bf087215..7a753d14 100644 --- a/example/4_interfaces.ts +++ b/example/4_interfaces.ts @@ -5,7 +5,7 @@ interface User { } // 변수에 사용하는 경우 -const seho: User = { name: 'hi', age: 100 }; +const seho: User = { name: '세호', age: 100 }; // 함수의 매개변수에 사용하는 경우 function getUser(user: User) { @@ -14,21 +14,34 @@ function getUser(user: User) { getUser(seho); // 함수의 전체 타입에 사용하는 경우 -// interface SumFunction { -// (a: number, b: number): number; -// } -// let sum: SumFunction; -// sum = function (num1: number, num2: string): number { -// return num1 + num2; -// }; +interface SumFunction { + (a: number, b: number): number; +} +let sum: SumFunction; +sum = function (num1: number, num2: string): number { + return num1 + num2; +}; // 배열의 인덱싱에 사용하는 경우 -// interface StringArray { -// [index: number]: string; -// } -// let arr: StringArray; -// arr[0] = 'hi'; -// arr[1] = 10; +interface StringArray { + [index: number]: string; +} +let arr: StringArray; +arr[0] = 'hi'; +arr[1] = 10; + +// 딕셔너리 패턴 +interface StringRegexDictionary { + [key: string]: RegExp; +} + +const regexMap: StringRegexDictionary = { + cssFile: /\.css$/, + jsFile: /\.js$/, +}; + +Object.keys(regexMap).forEach(function(value) { +}) // 인터페이스 확장 interface Person { diff --git a/example/7_union-intersection.ts b/example/7_union-intersection.ts index 47dcd1ca..171e3c20 100644 --- a/example/7_union-intersection.ts +++ b/example/7_union-intersection.ts @@ -37,4 +37,4 @@ interface Person { function askSomeone(someone: Developer | Person) { someone.name; // O someone.age; // X -} \ No newline at end of file +} diff --git a/example/8_generics.ts b/example/8_generics.ts index 636bc786..3b5de8be 100644 --- a/example/8_generics.ts +++ b/example/8_generics.ts @@ -39,14 +39,15 @@ interface ShoppingItems { stock: number; } function getAllowedOptions(option: T): T { - if (option === 'name' || option === 'address') { - console.log('option type is string'); - return option; - } - if (option === 'price' || option === 'stock') { - console.log('option type is number'); - return option; - } + return option; + // if (option === 'name' || option === 'address') { + // console.log('option type is string'); + // return option; + // } + // if (option === 'price' || option === 'stock') { + // console.log('option type is number'); + // return option; + // } } getAllowedOptions('nothing'); // const a = getAllowedOptions('name'); diff --git a/getting-started/index.js b/getting-started/index.js new file mode 100644 index 00000000..7353c52e --- /dev/null +++ b/getting-started/index.js @@ -0,0 +1,4 @@ +function sum(a, b) { + return a + b; +} +sum(10, 20); diff --git a/getting-started/index.ts b/getting-started/index.ts new file mode 100644 index 00000000..b61aa437 --- /dev/null +++ b/getting-started/index.ts @@ -0,0 +1,5 @@ +function sum(a: number, b: number): number { + return a + b; +} + +sum(10, 20); diff --git a/getting-started/tsconfig.json b/getting-started/tsconfig.json new file mode 100644 index 00000000..245154fb --- /dev/null +++ b/getting-started/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noImplicitAny": true + } +} diff --git a/quiz/1_todo/src/a.js b/quiz/1_todo/src/a.js new file mode 100644 index 00000000..4daca074 --- /dev/null +++ b/quiz/1_todo/src/a.js @@ -0,0 +1,12 @@ +let arr = [ + { gender: 'male', name: 'john' }, + { gender: 'female', name: 'sarah' }, + { gender: 'male', name: 'bone' }, +]; + +let filtered = arr.filter(function (item) { + if (item.gender === 'female') { + return item; + } +}); +console.log(filtered); diff --git a/quiz/1_todo/src/index.ts b/quiz/1_todo/src/index.ts index a4186753..d69a6631 100644 --- a/quiz/1_todo/src/index.ts +++ b/quiz/1_todo/src/index.ts @@ -1,7 +1,19 @@ -let todoItems; +// type Todo = { +// id: number; +// title: string; +// done: boolean; +// }; + +interface Todo { + id: number; + title: string; + done: boolean; +} + +let todoItems: Todo[]; // api -function fetchTodoItems() { +function fetchTodoItems(): Todo[] { const todos = [ { id: 1, title: '안녕', done: false }, { id: 2, title: '타입', done: false }, @@ -11,40 +23,56 @@ function fetchTodoItems() { } // crud methods -function fetchTodos() { +function fetchTodos(): object[] { const todos = fetchTodoItems(); return todos; } -function addTodo(todo) { +function addTodo(todo: Todo): void { todoItems.push(todo); } -function deleteTodo(index) { +function deleteTodo(index: number): void { todoItems.splice(index, 1); } -function completeTodo(index, todo) { +function completeTodo(index: number, todo: Todo): void { todo.done = true; todoItems.splice(index, 1, todo); } // business logic -function logFirstTodo() { +function logFirstTodo(): object { return todoItems[0]; } -function showCompleted() { +function showCompleted(): object[] { return todoItems.filter(item => item.done); + // return todoItems.filter(function(item) { + // if (item.done) { + // return item;` + // } + // }); } // TODO: 아래 함수의 내용을 채워보세요. 아래 함수는 `addTodo()` 함수를 이용하여 2개의 새 할 일을 추가하는 함수입니다. -function addTwoTodoItems() { +function addTwoTodoItems(): void { // addTodo() 함수를 두 번 호출하여 todoItems에 새 할 일이 2개 추가되어야 합니다. + const item1 = { + id: 4, + title: '아이템 4', + done: false, + }; + addTodo(item1); + addTodo({ + id: 5, + title: '아이템 5', + done: false, + }); } // NOTE: 유틸 함수 -function log() { +function log(): void { console.log(todoItems); } diff --git a/quiz/1_todo/tsconfig.json b/quiz/1_todo/tsconfig.json index 24f4d43d..65c6381f 100644 --- a/quiz/1_todo/tsconfig.json +++ b/quiz/1_todo/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "allowJs": true, "checkJs": true, - "noImplicitAny": false + "noImplicitAny": true }, "include": ["./src/**/*"] } diff --git a/why-ts/app.js b/why-ts/app.js new file mode 100644 index 00000000..ebc64928 --- /dev/null +++ b/why-ts/app.js @@ -0,0 +1,54 @@ +// api url +var url = 'https://jsonplaceholder.typicode.com/users/1'; + +// dom +var username = document.querySelector('#username'); +var email = document.querySelector('#email'); +var address = document.querySelector('#address'); + +// user data +var user = {}; + +/** + * @typedef {object} Address + * @property {string} street + * @property {string} city + */ + +/** + * @typedef {object} User + * @property {string} name + * @property {string} email + * @property {Address} address + */ + +/** + * @returns {Promise} + */ +function fetchUser() { + return axios.get(url); +} + +fetchUser().then(function (response) { + response.address.cit; +}); + +function startApp() { + // axios + // .get(url) + fetchUser() + .then(function (response) { + // console.log(response); + user = response.data; + // TODO: 이름, 이메일, 주소 표시하기 + console.log(user); + username.innerText = user[0].name; + email.innerText = user[0].email; + address.innerText = user[0].addres.street; + }) + .catch(function (error) { + console.log(error); + }); +} + +startApp(); diff --git a/why-ts/index.html b/why-ts/index.html new file mode 100644 index 00000000..9545784f --- /dev/null +++ b/why-ts/index.html @@ -0,0 +1,19 @@ + + + + + + Why Typescript? + + +

사용자 정보

+
+

이름:

+

이메일:

+

주소:

+
+ + + + + diff --git a/why-ts/sample.js b/why-ts/sample.js new file mode 100644 index 00000000..30542479 --- /dev/null +++ b/why-ts/sample.js @@ -0,0 +1,18 @@ +// function sum(a, b) { +// return a + b; +// } +// // sum(10, '20'); // 1020 +// var result = sum(10, 20); +// result.toLocalestring(); + +// @ts-check + +/** + * + * @param {number} a 첫번째 숫자 + * @param {number} b 두번째 숫자 + */ +function sum(a, b) { + return a + b; +} +sum(10, '20'); diff --git a/why-ts/sample.ts b/why-ts/sample.ts new file mode 100644 index 00000000..ed3ed29f --- /dev/null +++ b/why-ts/sample.ts @@ -0,0 +1,8 @@ +function add(a: number, b: number): number { + return a + b; +} +var result = add(10, 20); +// result.toLocaleString(); +result.toLocaleString(); + +// add(10, '20'); From a50d96a58edb1c607a07b9ec1775e74f8c23a2be Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Mon, 5 Oct 2020 11:45:18 +0900 Subject: [PATCH 05/13] from generic to quiz 2 solution --- class-note/8_generics.ts | 95 +++++++++++++++++++++++++++++++ example/8_generics.ts | 2 +- example/dropdown-generic.html | 26 +++++++++ example/dropdown-generic.ts | 50 ++++++++++++++++ quiz/2_address-book/.eslintrc.js | 4 +- quiz/2_address-book/src/a.ts | 14 +++++ quiz/2_address-book/src/index.ts | 36 ++++++++---- quiz/2_address-book/tsconfig.json | 4 +- 8 files changed, 217 insertions(+), 14 deletions(-) create mode 100644 class-note/8_generics.ts create mode 100644 example/dropdown-generic.html create mode 100644 example/dropdown-generic.ts create mode 100644 quiz/2_address-book/src/a.ts diff --git a/class-note/8_generics.ts b/class-note/8_generics.ts new file mode 100644 index 00000000..2d02a481 --- /dev/null +++ b/class-note/8_generics.ts @@ -0,0 +1,95 @@ +// function logText(text) { +// console.log(text); +// return text; +// } +// logText(10); // 숫자 10 +// logText('하이'); // 문자열 하이 +// logText(true); // 진위값 true + +// function logText(text: T): T { +// console.log(text); +// return text; +// } +// logText('하이'); + +// function logText(text: string) { +// console.log(text); +// // text.split('').reverse().join(''); +// return text; +// } + +// function logNumber(num: number) { +// console.log(num); +// return num; +// } + +// function logText(text: string | number) { +// console.log(text); +// return text; +// } + +// const a = logText('a'); +// logText(10); +// const num = logNumber(10); +// logText(true); + +function logText(text: T): T { + console.log(text); + return text; +} + +// const str = logText('abc'); +// str.split(''); +// const login = logText(true); + +// logText('a') +// logText(10) + +// 인터페이스에 제네릭을 선언하는 방법 +// interface Dropdown { +// value: string; +// selected: boolean; +// } + +// const obj: Dropdown = { value: 'abc', selected: false }; + +interface Dropdown { + value: T; + selected: boolean; +} +const obj: Dropdown = { value: 'abc', selected: false }; + +// 제네릭 타입 제한 +// function logTextLength(text: T[]): T[] { +// console.log(text.length); +// text.forEach(function (text) { +// console.log(text); +// }); +// return text; +// } +// logTextLength(['hi', 'abc']); + +// 제네릭 타입 제한 2 - 정의된 타입 이용하기 +interface LengthType { + length: number; +} +function logTextLength(text: T): T { + text.length; + return text; +} +logTextLength(10); +logTextLength({ leng: 10 }); + +// 제네릭 타입 제한 3 - keyof +interface ShoppingItem { + name: string; + price: number; + stock: number; +} + +function getShoppingItemOption(itemOption: T): T { + return itemOption; +} +// getShoppingItemOption(10); +// getShoppingItemOption('a'); +getShoppingItemOption('name'); diff --git a/example/8_generics.ts b/example/8_generics.ts index 3b5de8be..c98f24da 100644 --- a/example/8_generics.ts +++ b/example/8_generics.ts @@ -51,4 +51,4 @@ function getAllowedOptions(option: T): T { } getAllowedOptions('nothing'); // const a = getAllowedOptions('name'); -// a.toUpperCase(); // Name \ No newline at end of file +// a.toUpperCase(); // Name diff --git a/example/dropdown-generic.html b/example/dropdown-generic.html new file mode 100644 index 00000000..a21297b0 --- /dev/null +++ b/example/dropdown-generic.html @@ -0,0 +1,26 @@ + + + + + + Document + + +
+

이메일 선택 드롭다운

+ +
+
+

상품 수량 선택 드롭다운

+ +
+ + diff --git a/example/dropdown-generic.ts b/example/dropdown-generic.ts new file mode 100644 index 00000000..fbca5888 --- /dev/null +++ b/example/dropdown-generic.ts @@ -0,0 +1,50 @@ +interface DropdownItem { + value: T; + selected: boolean; +} + +// interface Email { +// value: string; +// selected: boolean; +// } + +const emails: DropdownItem[] = [ + { value: 'naver.com', selected: true }, + { value: 'gmail.com', selected: false }, + { value: 'hanmail.net', selected: false }, +]; + +// interface ProductNumber { +// value: number; +// selected: boolean; +// } + +// interface TrueFalse { +// value: boolean; +// selected: boolean; +// } + +const numberOfProducts: DropdownItem[] = [ + { value: 1, selected: true }, + { value: 2, selected: false }, + { value: 3, selected: false }, +]; + +function createDropdownItem(item: DropdownItem | DropdownItem) { + const option = document.createElement('option'); + option.value = item.value.toString(); + option.innerText = item.value.toString(); + option.selected = item.selected; + return option; +} + +// NOTE: 이메일 드롭 다운 아이템 추가 +emails.forEach(function (email) { + const item = createDropdownItem(email); + const selectTag = document.querySelector('#email-dropdown'); + selectTag.appendChild(item); +}); + +numberOfProducts.forEach(function (product) { + const item = createDropdownItem(product); +}); diff --git a/quiz/2_address-book/.eslintrc.js b/quiz/2_address-book/.eslintrc.js index 282cb6bc..d5747525 100644 --- a/quiz/2_address-book/.eslintrc.js +++ b/quiz/2_address-book/.eslintrc.js @@ -23,8 +23,8 @@ module.exports = { arrowParens: 'avoid', }, ], - '@typescript-eslint/no-explicit-any': 'off', - "@typescript-eslint/explicit-function-return-type": 'off', + // '@typescript-eslint/no-explicit-any': 'off', + // "@typescript-eslint/explicit-function-return-type": 'off', 'prefer-const': 'off', }, parserOptions: { diff --git a/quiz/2_address-book/src/a.ts b/quiz/2_address-book/src/a.ts new file mode 100644 index 00000000..85b471d5 --- /dev/null +++ b/quiz/2_address-book/src/a.ts @@ -0,0 +1,14 @@ +// function fetchItems() { +// let items = ['a', 'b', 'c']; +// return items; +// } +// let result = fetchItems(); +// console.log(result); + +function fetchItems(): Promise { + let items: string[] = ['a', 'b', 'c']; + return new Promise(function (resolve) { + resolve(items); + }); +} +fetchItems(); diff --git a/quiz/2_address-book/src/index.ts b/quiz/2_address-book/src/index.ts index 7ee67ba9..67e4ca2c 100644 --- a/quiz/2_address-book/src/index.ts +++ b/quiz/2_address-book/src/index.ts @@ -10,11 +10,17 @@ interface Contact { phones: PhoneNumberDictionary; } +enum PhoneType { + Home = 'home', + Office = 'office', + Studio = 'studio', +} + // api // TODO: 아래 함수의 반환 타입을 지정해보세요. -function fetchContacts() { +function fetchContacts(): Promise { // TODO: 아래 변수의 타입을 지정해보세요. - const contacts = [ + const contacts: Contact[] = [ { name: 'Tony', address: 'Malibu', @@ -57,45 +63,55 @@ function fetchContacts() { // main class AddressBook { // TODO: 아래 변수의 타입을 지정해보세요. - contacts = []; + contacts: Contact[] = []; constructor() { this.fetchData(); } - fetchData() { + fetchData(): void { fetchContacts().then(response => { this.contacts = response; }); } /* TODO: 아래 함수들의 파라미터 타입과 반환 타입을 지정해보세요 */ - findContactByName(name) { + findContactByName(name: string): Contact[] { return this.contacts.filter(contact => contact.name === name); } - findContactByAddress(address) { + findContactByAddress(address: string): Contact[] { return this.contacts.filter(contact => contact.address === address); } - findContactByPhone(phoneNumber, phoneType: string) { + // home, office, studio + findContactByPhone(phoneNumber: number, phoneType: PhoneType): Contact[] { return this.contacts.filter( contact => contact.phones[phoneType].num === phoneNumber ); } + // findContactByPhone('officce'); - addContact(contact) { + addContact(contact: Contact): void { this.contacts.push(contact); } - displayListByName() { + displayListByName(): string[] { return this.contacts.map(contact => contact.name); } - displayListByAddress() { + displayListByAddress(): string[] { return this.contacts.map(contact => contact.address); } /* ------------------------------------------------ */ } +// let heroes = [ +// { name: 'Tony', age: 30 }, +// { name: 'Captain', age: 100 }, +// ]; +// heroes.map(function (hero) { +// return hero.name; +// }); // ['Tony', 'Captain'] + new AddressBook(); diff --git a/quiz/2_address-book/tsconfig.json b/quiz/2_address-book/tsconfig.json index 671b504e..f75e2b36 100644 --- a/quiz/2_address-book/tsconfig.json +++ b/quiz/2_address-book/tsconfig.json @@ -4,7 +4,9 @@ "checkJs": true, "target": "es5", "lib": ["es2015", "dom", "dom.iterable"], - "noImplicitAny": false + "noImplicitAny": true, + "strict": true, + "strictFunctionTypes": true }, "include": ["./src/**/*"] } From 44a2a3c8f950f05cc45a34583ad4bf030c4d51ac Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Sun, 18 Oct 2020 18:48:59 +0900 Subject: [PATCH 06/13] til type-compatilibity --- class-note/10_type-assertion.ts | 13 +++++++++ class-note/11_type-guard.ts | 34 ++++++++++++++++++++++ class-note/12_type-compatibility.ts | 45 +++++++++++++++++++++++++++++ class-note/9_type-inference.ts | 39 +++++++++++++++++++++++++ class-note/ts-modules/app.ts | 6 ++++ class-note/ts-modules/types.ts | 4 +++ example/9_type-inference.ts | 26 +++++++++++++++++ example/type-comp.ts | 30 +++++++++++++++++++ quiz/2_address-book/src/index.ts | 21 +++----------- quiz/2_address-book/src/types.ts | 19 ++++++++++++ 10 files changed, 220 insertions(+), 17 deletions(-) create mode 100644 class-note/10_type-assertion.ts create mode 100644 class-note/11_type-guard.ts create mode 100644 class-note/12_type-compatibility.ts create mode 100644 class-note/9_type-inference.ts create mode 100644 class-note/ts-modules/app.ts create mode 100644 class-note/ts-modules/types.ts create mode 100644 example/9_type-inference.ts create mode 100644 example/type-comp.ts create mode 100644 quiz/2_address-book/src/types.ts diff --git a/class-note/10_type-assertion.ts b/class-note/10_type-assertion.ts new file mode 100644 index 00000000..04119cba --- /dev/null +++ b/class-note/10_type-assertion.ts @@ -0,0 +1,13 @@ +// 타입 단언(type assertion) +var a; +a = 20; +a = 'a' +var b = a as string; + +// DOM API 조작 +//
hi
+ +var div = document.querySelector('div'); +if (div) { + div.innerText +} \ No newline at end of file diff --git a/class-note/11_type-guard.ts b/class-note/11_type-guard.ts new file mode 100644 index 00000000..23c25116 --- /dev/null +++ b/class-note/11_type-guard.ts @@ -0,0 +1,34 @@ +interface Developer { + name: string; + skill: string; +} + +interface Person { + name: string; + age: number; +} + +function introduce(): Developer | Person { + return { name: 'Tony', age: 33, skill: 'Iron Making' } +} +var tony = introduce(); +console.log(tony.skill); + +if ((tony as Developer).skill) { + var skill = (tony as Developer).skill; + console.log(skill); +} else if ((tony as Person).age) { + var age = (tony as Person).age; + console.log(age); +} + +// 타입 가드 정의 +function isDeveloper(target: Developer | Person): target is Developer { + return (target as Developer).skill !== undefined; +} + +if (isDeveloper(tony)) { + console.log(tony.skill); +} else { + console.log(tony.age); +} \ No newline at end of file diff --git a/class-note/12_type-compatibility.ts b/class-note/12_type-compatibility.ts new file mode 100644 index 00000000..1e07d5e7 --- /dev/null +++ b/class-note/12_type-compatibility.ts @@ -0,0 +1,45 @@ +// 인터페이스 +interface Developer { + name: string; + skill: string; +} +// interface Person { +// name: string; +// // skill: string; +// } +class Person { + name: string; + skill: string; +} + +var developer: Developer; +var person: Person; +developer = new Person(); +// person = developer; + +// 함수 +var add = function(a: number) { + // ... +} +var sum = function(a: number, b: number) { + // ... +} +sum = add; +// add = sum; + +// 제네릭 +interface Empty { + // .. +} +var empty1: Empty; +var empty2: Empty; +empty1 = empty2; +empty2 = empty1; + +interface NotEmpty { + data: T; +} +var notempty1: NotEmpty; +var notempty2: NotEmpty; +notempty1 = notempty2; +notempty2 = notempty1; \ No newline at end of file diff --git a/class-note/9_type-inference.ts b/class-note/9_type-inference.ts new file mode 100644 index 00000000..3a12f99f --- /dev/null +++ b/class-note/9_type-inference.ts @@ -0,0 +1,39 @@ +// 타입 추론 기본 1 +var a = 'abc'; + +function getB(b = 10) { + var c = 'hi'; + return b + c; +} + +10 + '10'; // 1010 + +// 타입 추론 기본 2 +// interface Dropdown { +// value: T; +// title: string; +// } +// var shoppingItem: Dropdown = { +// value: 'abc', +// title: 'hello' +// } + +// 타입 추론 기본 3 +interface Dropdown { + value: T; + title: string; +} +interface DetailedDropdown extends Dropdown { + description: string; + tag: K; +} + +var detailedItem: DetailedDropdown = { + title: 'abc', + description: 'ab', + value: 'a', + tag: 'a', +}; + +// Best Common Type +var arr = [1, 2, true, true, 'a']; diff --git a/class-note/ts-modules/app.ts b/class-note/ts-modules/app.ts new file mode 100644 index 00000000..fb21cc25 --- /dev/null +++ b/class-note/ts-modules/app.ts @@ -0,0 +1,6 @@ +import { Todo } from './types' + +var item: Todo = { + title: '할 일 1', + checked: false, +} \ No newline at end of file diff --git a/class-note/ts-modules/types.ts b/class-note/ts-modules/types.ts new file mode 100644 index 00000000..338f2d89 --- /dev/null +++ b/class-note/ts-modules/types.ts @@ -0,0 +1,4 @@ +export interface Todo { + title: string; + checked: boolean; +} diff --git a/example/9_type-inference.ts b/example/9_type-inference.ts new file mode 100644 index 00000000..9e47543c --- /dev/null +++ b/example/9_type-inference.ts @@ -0,0 +1,26 @@ +var a = 'a'; + +function logA(a = 'a') { + var b = 10; + return b; +} + +interface Dropdown { + value: T + title: string; +} +var items: Dropdown = { + value: 10, + title: 'a' +} + +interface DetailedDropdown extends Dropdown { + description: string; + tag: T; +} +var detailItems: DetailedDropdown = { + value: 'hi', + title: 'a', + description: 'b', + tag: 'c' +} \ No newline at end of file diff --git a/example/type-comp.ts b/example/type-comp.ts new file mode 100644 index 00000000..73156855 --- /dev/null +++ b/example/type-comp.ts @@ -0,0 +1,30 @@ +// 인터페이스 +interface Developer { + name: string; + skill: string; +} + +interface Person { + name: string; +} + +var a: Developer; +var b: Person; +// a = b; // X +b = a; // O + +// 함수 +var add = function(a: number) { + // ... +} +var sum = function(a: number, b: number) { + // ... +} +// sum = add; // X +// add = sum; // O + +// // 유니온 타입 +// var c: Developer | Person; +// var d: Person | string; +// c = d; +// d = c; \ No newline at end of file diff --git a/quiz/2_address-book/src/index.ts b/quiz/2_address-book/src/index.ts index 67e4ca2c..54bb40d8 100644 --- a/quiz/2_address-book/src/index.ts +++ b/quiz/2_address-book/src/index.ts @@ -1,20 +1,4 @@ -interface PhoneNumberDictionary { - [phone: string]: { - num: number; - }; -} - -interface Contact { - name: string; - address: string; - phones: PhoneNumberDictionary; -} - -enum PhoneType { - Home = 'home', - Office = 'office', - Studio = 'studio', -} +import { Contact, PhoneType } from './types'; // api // TODO: 아래 함수의 반환 타입을 지정해보세요. @@ -106,6 +90,9 @@ class AddressBook { /* ------------------------------------------------ */ } +let div = document.querySelector('.container') as HTMLDivElement; +div.innerText; + // let heroes = [ // { name: 'Tony', age: 30 }, // { name: 'Captain', age: 100 }, diff --git a/quiz/2_address-book/src/types.ts b/quiz/2_address-book/src/types.ts new file mode 100644 index 00000000..4913f520 --- /dev/null +++ b/quiz/2_address-book/src/types.ts @@ -0,0 +1,19 @@ +interface PhoneNumberDictionary { + [phone: string]: { + num: number; + }; +} + +interface Contact { + name: string; + address: string; + phones: PhoneNumberDictionary; +} + +enum PhoneType { + Home = 'home', + Office = 'office', + Studio = 'studio', +} + +export { Contact, PhoneType }; From da9920cd8bcd2a92af74c2e5583a27036c4baa7b Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Sun, 15 Nov 2020 01:32:02 +0900 Subject: [PATCH 07/13] add utility type and mapped type class code --- class-note/13_utility-type.ts | 72 +++++++++++++++++++++++++++++++++++ class-note/14_mapped-type.ts | 13 +++++++ 2 files changed, 85 insertions(+) create mode 100644 class-note/13_utility-type.ts create mode 100644 class-note/14_mapped-type.ts diff --git a/class-note/13_utility-type.ts b/class-note/13_utility-type.ts new file mode 100644 index 00000000..f2453439 --- /dev/null +++ b/class-note/13_utility-type.ts @@ -0,0 +1,72 @@ +interface Product { + id: number; + name: string; + price: number; + brand: string; + stock: number; +} + +// 1. 상품 목록을 받아오기 위한 API 함수 +function fetchProducts(): Promise { + // .. +} + +// interface ProductDetail { +// id: number; +// name: string; +// price: number; +// } + +// 2. 특정 상품의 상세 정보를 나타내기 위한 함수 +type ShoppingItem = Pick +function displayProductDetail(shoppingItem: Pick) { + +} + +// interface UpdateProduct { +// id?: number; +// name?: string; +// price?: number; +// brand?: string; +// stock?: number; +// } + +type UpdateProduct = Partial +// 3. 특정 상품 정보를 업데이트(갱신)하는 함수 +function updateProductItem(productItem: Partial) { + +} + +// 4. 유틸리티 타입 구현하기 - Partial +interface UserProfile { + username: string; + email: string; + profilePhotoUrl: string; +} +// interface UserProfileUpdate { +// username?: string; +// email?: string; +// profilePhotoUrl?: string; +// } +// #1 +// type UserProfileUpdate = { +// username?: UserProfile['username']; +// email?: UserProfile['email']; +// profilePhotoUrl?: UserProfile['profilePhotoUrl']; +// } + +// #2 +type UserProfileUpdate = { + [p in 'username' | 'email' | 'profilePhotoUrl']?: UserProfile[p] +} +type UserProfileKeys = keyof UserProfile + +// #3 +type UserProfileUpdate = { + [p in keyof UserProfile]?: UserProfile[p] +} + +// #4 +type Subset = { + [p in keyof T]?: T[p] +} diff --git a/class-note/14_mapped-type.ts b/class-note/14_mapped-type.ts new file mode 100644 index 00000000..208ac938 --- /dev/null +++ b/class-note/14_mapped-type.ts @@ -0,0 +1,13 @@ +type Heroes = 'Hulk' | 'Capt' | 'Thor' +type HeroAges = { [K in Heroes]: number } +const ages: HeroAges = { + Hulk: 33, + Capt: 100, + Thor: 1000, +} + +// for in 반복문 코드 +// var arr = ['a','b','c']; +// for (var key in arr) { +// console.log(arr[key]); +// } \ No newline at end of file From 8601c4d841989503c1876fe9d4b6d96f9543e109 Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Sun, 15 Nov 2020 18:18:12 +0900 Subject: [PATCH 08/13] clean up the unnecessary code and update the stylesheets for the final project --- project/app.js | 17 +---------------- project/main.css | 6 +++--- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/project/app.js b/project/app.js index b9c6c896..680ec69c 100644 --- a/project/app.js +++ b/project/app.js @@ -86,7 +86,6 @@ async function handleListClick(event) { selectedId, 'confirmed', ); - console.log(confirmedResponse); endLoadingAnimation(); setDeathsList(deathResponse); setTotalDeathsByCountry(deathResponse); @@ -94,7 +93,6 @@ async function handleListClick(event) { setTotalRecoveredByCountry(recoveredResponse); setChartData(confirmedResponse); isDeathLoading = false; - // console.log(data); } function setDeathsList(data) { @@ -159,33 +157,20 @@ function endLoadingAnimation() { recoveredList.removeChild(recoveredSpinner); } -// async function setupData() { const { data } = await fetchCovidSummary(); - console.log(data); setTotalConfirmedNumber(data); setTotalDeathsByWorld(data); setTotalRecoveredByWorld(data); setCountryRanksByConfirmedCases(data); setLastUpdatedTimestamp(data); - // renderChart(); } function renderChart(data, labels) { var ctx = $('#lineChart').getContext('2d'); - const defaultLabel = [ - 'January', - 'February', - 'March', - 'April', - 'May', - 'June', - 'July', - ]; - const defaultData = [0, 10, 5, 2, 20, 30, 45]; Chart.defaults.global.defaultFontColor = '#f5eaea'; Chart.defaults.global.defaultFontFamily = 'Exo 2'; - var chart = new Chart(ctx, { + new Chart(ctx, { type: 'line', data: { labels, diff --git a/project/main.css b/project/main.css index 80c4b765..cfd15b47 100644 --- a/project/main.css +++ b/project/main.css @@ -123,7 +123,7 @@ header > h1 { font-size: 1.125rem; font-weight: 750; padding: 0 0.7rem; - width: 70px; + width: 98px; } .country { font-size: 1.125rem; @@ -166,14 +166,14 @@ header > h1 { padding: 0 0.4rem; font-size: 1.125rem; font-weight: 550; - width: 70px; + width: 84px; color: white; } .list-item-b > .recovered { padding: 0 0.4rem; font-size: 1.125rem; font-weight: 550; - width: 70px; + width: 84px; } .recovered-container { margin-left: 1rem; From 02794d14eb519fd858fe9b2d2028a59777276885 Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Sun, 22 Nov 2020 15:56:20 +0900 Subject: [PATCH 09/13] add configuration on how to setup eslint for typescript along with vscode plugins --- setup/README.md | 83 +++++++++++++++++++++++++++++++++++ setup/command-palette.png | Bin 0 -> 38159 bytes setup/format-on-save-off.png | Bin 0 -> 85024 bytes 3 files changed, 83 insertions(+) create mode 100644 setup/README.md create mode 100644 setup/command-palette.png create mode 100644 setup/format-on-save-off.png diff --git a/setup/README.md b/setup/README.md new file mode 100644 index 00000000..e63672d1 --- /dev/null +++ b/setup/README.md @@ -0,0 +1,83 @@ +## 타입스크립트 프로젝트 환경 구성 + +1. 프로젝트 폴더 생성 +2. `npm init -y`로 `package.json` 파일 생성 +3. 아래 명령어로 타입스크립트 및 문법 검사, 코드 정리 도구 라이브러리 추가 + +```sh +npm i -D typescript @babel/core @babel/preset-env @babel/preset-typescript @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint prettier eslint-plugin-prettier +``` + +4. 프로젝트 폴더 바로 아래에 ESLint 설정 파일 추가 + +```js +// .eslintrc.js +module.exports = { + root: true, + env: { + browser: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + plugins: ['prettier', '@typescript-eslint'], + rules: { + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + semi: true, + useTabs: false, + tabWidth: 2, + printWidth: 80, + bracketSpacing: true, + arrowParens: 'avoid', + }, + ], + }, + parserOptions: { + parser: '@typescript-eslint/parser', + }, +}; +``` + +5. ESLint 이그노어 파일 추가 + +``` +// .eslintignore +node_modules +``` + +## VSCode ESLint 플러그인 관련 설정 + +1. VSCode의 [ESLint 플러그인](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) 설치 +2. VSCode에서 `ctrl` + `shift` + `p` / `cmd` + `shift` + `p` 키를 이용하여 명령어 실행 창 표시 +3. 명령어 실행 창에 `open settings (json)` 입력 후 선택 + +![find-user-settings-on-command-palette](./command-palette.png) + +4. VSCode 사용자 정의 파일인 `settings.json` 파일의 내용에 아래와 같이 ESLint 플러그인 관련 설정 추가. + +```js +{ + // ... <-- 기존 내용을 꼭 유지한 상태에서 아래 내용을 추가하고 이 주석은 제거할 것 + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, + "eslint.alwaysShowStatus": true, + "eslint.workingDirectories": [ + {"mode": "auto"} + ], + "eslint.validate": [ + "javascript", + "typescript" + ], +} +``` + +5. `ctrl` + `,` 또는 `cmd` + `,` 눌러서 VSCode 설정 파일(Settings)에 들어간 후 `format on save` 검색. 아래와 같이 체크가 안되어 있는지 확인. + +![format-on-save-off](./format-on-save-off.png) \ No newline at end of file diff --git a/setup/command-palette.png b/setup/command-palette.png new file mode 100644 index 0000000000000000000000000000000000000000..83eb052ff581d13f0c2ac7644b28fb5dc1a9d8b7 GIT binary patch literal 38159 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 MoI#sBfnSdK4~Bo)`2YX_ literal 0 HcmV?d00001 diff --git a/setup/format-on-save-off.png b/setup/format-on-save-off.png new file mode 100644 index 0000000000000000000000000000000000000000..609f06e837e1ebf292f988cede1130633c5c350e GIT binary patch literal 85024 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 z Date: Sun, 22 Nov 2020 22:44:16 +0900 Subject: [PATCH 10/13] add implicit any typing and project configuration with babel, eslint, prettier --- es6/arrow-function.js | 19 + project/.eslintignore | 1 + project/.eslintrc.js | 31 + project/README.md | 12 + project/built/app.js | 259 ++++ project/package-lock.json | 2566 ++++++++++++++++++++++++++++++++ project/package.json | 25 + project/{app.js => src/app.ts} | 98 +- project/tsconfig.json | 11 + 9 files changed, 2981 insertions(+), 41 deletions(-) create mode 100644 es6/arrow-function.js create mode 100644 project/.eslintignore create mode 100644 project/.eslintrc.js create mode 100644 project/built/app.js create mode 100644 project/package-lock.json create mode 100644 project/package.json rename project/{app.js => src/app.ts} (69%) create mode 100644 project/tsconfig.json diff --git a/es6/arrow-function.js b/es6/arrow-function.js new file mode 100644 index 00000000..593e230f --- /dev/null +++ b/es6/arrow-function.js @@ -0,0 +1,19 @@ +// ES5 - 함수 선언문 +function sum(a, b) { + return a + b; +} +// ES5 - 함수 표현식 +var sum = function(a, b) { + return a + b; +} + +// ES6+ - 함수 표현식(화살표 함수) +var sum = (a, b) => { + return a + b; +} +var sum = (a, b) => a + b; + +// 타입스크립트의 화살표 함수 +var sum = (a: number, b: number): number => { + return a + b; +} \ No newline at end of file diff --git a/project/.eslintignore b/project/.eslintignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/project/.eslintignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/project/.eslintrc.js b/project/.eslintrc.js new file mode 100644 index 00000000..a900b4b7 --- /dev/null +++ b/project/.eslintrc.js @@ -0,0 +1,31 @@ +// .eslintrc.js +module.exports = { + root: true, + env: { + browser: true, + node: true, + }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + plugins: ['prettier', '@typescript-eslint'], + rules: { + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + semi: true, + useTabs: false, + tabWidth: 2, + printWidth: 80, + bracketSpacing: true, + arrowParens: 'avoid', + }, + ], + }, + parserOptions: { + parser: '@typescript-eslint/parser', + }, +}; diff --git a/project/README.md b/project/README.md index b3ba8aa8..069d983d 100644 --- a/project/README.md +++ b/project/README.md @@ -2,6 +2,18 @@ 최종 프로젝트 폴더입니다 +## 자바스크립트 프로젝트에 타입스크립트 적용하기 + +0. 자바스크립트 파일에 JSDoc으로 타입 시스템 입히기 +1. 타입스크립트의 기본 환경 구성 + - [x] NPM 초기화 + - [x] 타입스크립트 라이브러리 설치 + - [x] 타입스크립트 설정 파일 생성 및 기본 값 추가 + - [x] 자바스크립트 파일을 타입스크립트 파일로 변환 + - [x] `tsc` 명령어로 타입스크립트 컴파일 하기 +2. 명시적인 `any` 선언하기 + - `tsconfig.json` 파일에 `noImplicitAny` 값을 `true`로 추가 + ## 참고 자료 - [존스 홉킨스 코로나 현황](https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6) diff --git a/project/built/app.js b/project/built/app.js new file mode 100644 index 00000000..bacad4df --- /dev/null +++ b/project/built/app.js @@ -0,0 +1,259 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +// utils +function $(selector) { + return document.querySelector(selector); +} +function getUnixTimestamp(date) { + return new Date(date).getTime(); +} +// DOM +var a; +var confirmedTotal = $('.confirmed-total'); +var deathsTotal = $('.deaths'); +var recoveredTotal = $('.recovered'); +var lastUpdatedTime = $('.last-updated-time'); +var rankList = $('.rank-list'); +var deathsList = $('.deaths-list'); +var recoveredList = $('.recovered-list'); +var deathSpinner = createSpinnerElement('deaths-spinner'); +var recoveredSpinner = createSpinnerElement('recovered-spinner'); +function createSpinnerElement(id) { + var wrapperDiv = document.createElement('div'); + wrapperDiv.setAttribute('id', id); + wrapperDiv.setAttribute('class', 'spinner-wrapper flex justify-center align-center'); + var spinnerDiv = document.createElement('div'); + spinnerDiv.setAttribute('class', 'ripple-spinner'); + spinnerDiv.appendChild(document.createElement('div')); + spinnerDiv.appendChild(document.createElement('div')); + wrapperDiv.appendChild(spinnerDiv); + return wrapperDiv; +} +// state +var isDeathLoading = false; +var isRecoveredLoading = false; +// api +function fetchCovidSummary() { + var url = 'https://api.covid19api.com/summary'; + return axios.get(url); +} +var CovidStatus; +(function (CovidStatus) { + CovidStatus["Confirmed"] = "confirmed"; + CovidStatus["Recovered"] = "recovered"; + CovidStatus["Deaths"] = "deaths"; +})(CovidStatus || (CovidStatus = {})); +function fetchCountryInfo(countryCode, status) { + // status params: confirmed, recovered, deaths + var url = "https://api.covid19api.com/country/" + countryCode + "/status/" + status; + return axios.get(url); +} +// methods +function startApp() { + setupData(); + initEvents(); +} +// events +function initEvents() { + rankList.addEventListener('click', handleListClick); +} +function handleListClick(event) { + return __awaiter(this, void 0, void 0, function () { + var selectedId, deathResponse, recoveredResponse, confirmedResponse; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + if (event.target instanceof HTMLParagraphElement || + event.target instanceof HTMLSpanElement) { + selectedId = event.target.parentElement.id; + } + if (event.target instanceof HTMLLIElement) { + selectedId = event.target.id; + } + if (isDeathLoading) { + return [2 /*return*/]; + } + clearDeathList(); + clearRecoveredList(); + startLoadingAnimation(); + isDeathLoading = true; + return [4 /*yield*/, fetchCountryInfo(selectedId, CovidStatus.Deaths)]; + case 1: + deathResponse = (_a.sent()).data; + return [4 /*yield*/, fetchCountryInfo(selectedId, CovidStatus.Recovered)]; + case 2: + recoveredResponse = (_a.sent()).data; + return [4 /*yield*/, fetchCountryInfo(selectedId, CovidStatus.Confirmed)]; + case 3: + confirmedResponse = (_a.sent()).data; + endLoadingAnimation(); + setDeathsList(deathResponse); + setTotalDeathsByCountry(deathResponse); + setRecoveredList(recoveredResponse); + setTotalRecoveredByCountry(recoveredResponse); + setChartData(confirmedResponse); + isDeathLoading = false; + return [2 /*return*/]; + } + }); + }); +} +function setDeathsList(data) { + var sorted = data.sort(function (a, b) { return getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date); }); + sorted.forEach(function (value) { + var li = document.createElement('li'); + li.setAttribute('class', 'list-item-b flex align-center'); + var span = document.createElement('span'); + span.textContent = value.Cases; + span.setAttribute('class', 'deaths'); + var p = document.createElement('p'); + p.textContent = new Date(value.Date).toLocaleDateString().slice(0, -1); + li.appendChild(span); + li.appendChild(p); + deathsList.appendChild(li); + }); +} +function clearDeathList() { + deathsList.innerHTML = null; +} +function setTotalDeathsByCountry(data) { + deathsTotal.innerText = data[0].Cases; +} +function setRecoveredList(data) { + var sorted = data.sort(function (a, b) { return getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date); }); + sorted.forEach(function (value) { + var li = document.createElement('li'); + li.setAttribute('class', 'list-item-b flex align-center'); + var span = document.createElement('span'); + span.textContent = value.Cases; + span.setAttribute('class', 'recovered'); + var p = document.createElement('p'); + p.textContent = new Date(value.Date).toLocaleDateString().slice(0, -1); + li.appendChild(span); + li.appendChild(p); + recoveredList.appendChild(li); + }); +} +function clearRecoveredList() { + recoveredList.innerHTML = null; +} +function setTotalRecoveredByCountry(data) { + recoveredTotal.innerText = data[0].Cases; +} +function startLoadingAnimation() { + deathsList.appendChild(deathSpinner); + recoveredList.appendChild(recoveredSpinner); +} +function endLoadingAnimation() { + deathsList.removeChild(deathSpinner); + recoveredList.removeChild(recoveredSpinner); +} +function setupData() { + return __awaiter(this, void 0, void 0, function () { + var data; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, fetchCovidSummary()]; + case 1: + data = (_a.sent()).data; + setTotalConfirmedNumber(data); + setTotalDeathsByWorld(data); + setTotalRecoveredByWorld(data); + setCountryRanksByConfirmedCases(data); + setLastUpdatedTimestamp(data); + return [2 /*return*/]; + } + }); + }); +} +function renderChart(data, labels) { + var ctx = $('#lineChart').getContext('2d'); + Chart.defaults.global.defaultFontColor = '#f5eaea'; + Chart.defaults.global.defaultFontFamily = 'Exo 2'; + new Chart(ctx, { + type: 'line', + data: { + labels: labels, + datasets: [ + { + label: 'Confirmed for the last two weeks', + backgroundColor: '#feb72b', + borderColor: '#feb72b', + data: data, + }, + ], + }, + options: {}, + }); +} +function setChartData(data) { + var chartData = data.slice(-14).map(function (value) { return value.Cases; }); + var chartLabel = data + .slice(-14) + .map(function (value) { return new Date(value.Date).toLocaleDateString().slice(5, -1); }); + renderChart(chartData, chartLabel); +} +function setTotalConfirmedNumber(data) { + confirmedTotal.innerText = data.Countries.reduce(function (total, current) { return (total += current.TotalConfirmed); }, 0); +} +function setTotalDeathsByWorld(data) { + deathsTotal.innerText = data.Countries.reduce(function (total, current) { return (total += current.TotalDeaths); }, 0); +} +function setTotalRecoveredByWorld(data) { + recoveredTotal.innerText = data.Countries.reduce(function (total, current) { return (total += current.TotalRecovered); }, 0); +} +function setCountryRanksByConfirmedCases(data) { + var sorted = data.Countries.sort(function (a, b) { return b.TotalConfirmed - a.TotalConfirmed; }); + sorted.forEach(function (value) { + var li = document.createElement('li'); + li.setAttribute('class', 'list-item flex align-center'); + li.setAttribute('id', value.Slug); + var span = document.createElement('span'); + span.textContent = value.TotalConfirmed; + span.setAttribute('class', 'cases'); + var p = document.createElement('p'); + p.setAttribute('class', 'country'); + p.textContent = value.Country; + li.appendChild(span); + li.appendChild(p); + rankList.appendChild(li); + }); +} +function setLastUpdatedTimestamp(data) { + lastUpdatedTime.innerText = new Date(data.Date).toLocaleString(); +} +startApp(); diff --git a/project/package-lock.json b/project/package-lock.json new file mode 100644 index 00000000..03a92e71 --- /dev/null +++ b/project/package-lock.json @@ -0,0 +1,2566 @@ +{ + "name": "project", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true + }, + "@babel/core": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.7.tgz", + "integrity": "sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.7", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", + "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz", + "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", + "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz", + "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", + "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz", + "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", + "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", + "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz", + "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.12.1" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.7.tgz", + "integrity": "sha512-OnNdfAr1FUQg7ksb7bmbKoby4qFOHw6DKWWUNB9KqnnCldxhxJlP+21dpyaWFmf2h0rTbOkXJtAGevY3XW1eew==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-dynamic-import": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.1", + "@babel/plugin-proposal-json-strings": "^7.12.1", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", + "@babel/plugin-proposal-private-methods": "^7.12.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.12.1", + "@babel/plugin-transform-arrow-functions": "^7.12.1", + "@babel/plugin-transform-async-to-generator": "^7.12.1", + "@babel/plugin-transform-block-scoped-functions": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-classes": "^7.12.1", + "@babel/plugin-transform-computed-properties": "^7.12.1", + "@babel/plugin-transform-destructuring": "^7.12.1", + "@babel/plugin-transform-dotall-regex": "^7.12.1", + "@babel/plugin-transform-duplicate-keys": "^7.12.1", + "@babel/plugin-transform-exponentiation-operator": "^7.12.1", + "@babel/plugin-transform-for-of": "^7.12.1", + "@babel/plugin-transform-function-name": "^7.12.1", + "@babel/plugin-transform-literals": "^7.12.1", + "@babel/plugin-transform-member-expression-literals": "^7.12.1", + "@babel/plugin-transform-modules-amd": "^7.12.1", + "@babel/plugin-transform-modules-commonjs": "^7.12.1", + "@babel/plugin-transform-modules-systemjs": "^7.12.1", + "@babel/plugin-transform-modules-umd": "^7.12.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", + "@babel/plugin-transform-new-target": "^7.12.1", + "@babel/plugin-transform-object-super": "^7.12.1", + "@babel/plugin-transform-parameters": "^7.12.1", + "@babel/plugin-transform-property-literals": "^7.12.1", + "@babel/plugin-transform-regenerator": "^7.12.1", + "@babel/plugin-transform-reserved-words": "^7.12.1", + "@babel/plugin-transform-shorthand-properties": "^7.12.1", + "@babel/plugin-transform-spread": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", + "@babel/plugin-transform-template-literals": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-unicode-escapes": "^7.12.1", + "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.12.7", + "core-js-compat": "^3.7.0", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-typescript": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.7.tgz", + "integrity": "sha512-nOoIqIqBmHBSEgBXWR4Dv/XBehtIFcw9PqZw6rFYuKrzsZmOQm3PR5siLBnKZFEsDb03IegG8nSjU/iXXXYRmw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-option": "^7.12.1", + "@babel/plugin-transform-typescript": "^7.12.1" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.7.tgz", + "integrity": "sha512-nMWaqsQEeSvMNypswUDzjqQ+0rR6pqCtoQpsqGJC4/Khm9cISwPTSpai57F6/jDaOoEGz8yE/WxcO3PV6tKSmQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", + "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", + "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.1.tgz", + "integrity": "sha512-d7LeQ7dbUrIv5YVFNzGgaW3IQKMmnmKFneRWagRlGYOSfLJVaRbj/FrBNOBC1a3tVO+TgNq1GbHvRtg1kwL0FQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.8.1", + "@typescript-eslint/scope-manager": "4.8.1", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.8.1.tgz", + "integrity": "sha512-WigyLn144R3+lGATXW4nNcDJ9JlTkG8YdBWHkDlN0lC3gUGtDi7Pe3h5GPvFKMcRz8KbZpm9FJV9NTW8CpRHpg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.8.1", + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/typescript-estree": "4.8.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.8.1.tgz", + "integrity": "sha512-QND8XSVetATHK9y2Ltc/XBl5Ro7Y62YuZKnPEwnNPB8E379fDsvzJ1dMJ46fg/VOmk0hXhatc+GXs5MaXuL5Uw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.8.1", + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/typescript-estree": "4.8.1", + "debug": "^4.1.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.8.1.tgz", + "integrity": "sha512-r0iUOc41KFFbZdPAdCS4K1mXivnSZqXS5D9oW+iykQsRlTbQRfuFRSW20xKDdYiaCoH+SkSLeIF484g3kWzwOQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/visitor-keys": "4.8.1" + } + }, + "@typescript-eslint/types": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.8.1.tgz", + "integrity": "sha512-ave2a18x2Y25q5K05K/U3JQIe2Av4+TNi/2YuzyaXLAsDx6UZkz1boZ7nR/N6Wwae2PpudTZmHFXqu7faXfHmA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.8.1.tgz", + "integrity": "sha512-bJ6Fn/6tW2g7WIkCWh3QRlaSU7CdUUK52shx36/J7T5oTQzANvi6raoTsbwGM11+7eBbeem8hCCKbyvAc0X3sQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.8.1", + "@typescript-eslint/visitor-keys": "4.8.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.8.1.tgz", + "integrity": "sha512-3nrwXFdEYALQh/zW8rFwP4QltqsanCDz4CwWMPiIZmwlk9GlvBeueEIbq05SEq4ganqM0g9nh02xXgv5XI3PeQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.8.1", + "eslint-visitor-keys": "^2.0.0" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.14.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.7.tgz", + "integrity": "sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001157", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.591", + "escalade": "^3.1.1", + "node-releases": "^1.1.66" + } + }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001159", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz", + "integrity": "sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js-compat": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.7.0.tgz", + "integrity": "sha512-V8yBI3+ZLDVomoWICO6kq/CD28Y4r1M7CWeO4AGpMdMfseu8bkSubBmUPySMGKRTS+su4XQ07zUkAsiu9FCWTg==", + "dev": true, + "requires": { + "browserslist": "^4.14.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "electron-to-chromium": { + "version": "1.3.603", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz", + "integrity": "sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.14.0.tgz", + "integrity": "sha512-5YubdnPXrlrYAFCKybPuHIAH++PINe1pmKNc5wQRB9HSbqIK1ywAnntE3Wwua4giKu0bjligf1gLF6qxMGOYRA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", + "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", + "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-core-module": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", + "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-releases": { + "version": "1.1.67", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", + "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.0.tgz", + "integrity": "sha512-yYerpkvseM4iKD/BXLYUkQV5aKt4tQPqaGW6EsZjzyu0r7sVZZNPJW4Y8MyKmicp6t42XUPcBVA+H6sB3gqndw==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "typescript": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + } + } +} diff --git a/project/package.json b/project/package.json new file mode 100644 index 00000000..b71ccb68 --- /dev/null +++ b/project/package.json @@ -0,0 +1,25 @@ +{ + "name": "project", + "version": "1.0.0", + "description": "최종 프로젝트 폴더입니다", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "tsc" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": {}, + "devDependencies": { + "@babel/core": "^7.12.7", + "@babel/preset-env": "^7.12.7", + "@babel/preset-typescript": "^7.12.7", + "@typescript-eslint/eslint-plugin": "^4.8.1", + "@typescript-eslint/parser": "^4.8.1", + "eslint": "^7.14.0", + "eslint-plugin-prettier": "^3.1.4", + "prettier": "^2.2.0", + "typescript": "^4.1.2" + } +} diff --git a/project/app.js b/project/src/app.ts similarity index 69% rename from project/app.js rename to project/src/app.ts index 680ec69c..9a2c4f30 100644 --- a/project/app.js +++ b/project/src/app.ts @@ -1,28 +1,33 @@ +const sum = (a, b) => a + b; + // utils -function $(selector) { +function $(selector: string) { return document.querySelector(selector); } -function getUnixTimestamp(date) { +function getUnixTimestamp(date: Date) { return new Date(date).getTime(); } +const a = 10; + // DOM -const confirmedTotal = $('.confirmed-total'); -const deathsTotal = $('.deaths'); -const recoveredTotal = $('.recovered'); -const lastUpdatedTime = $('.last-updated-time'); +let a: Element | HTMLElement | HTMLParagraphElement; +const confirmedTotal = $('.confirmed-total') as HTMLSpanElement; +const deathsTotal: HTMLParagraphElement = $('.deaths'); +const recoveredTotal = $('.recovered') as HTMLParagraphElement; +const lastUpdatedTime = $('.last-updated-time') as HTMLParagraphElement; const rankList = $('.rank-list'); const deathsList = $('.deaths-list'); const recoveredList = $('.recovered-list'); const deathSpinner = createSpinnerElement('deaths-spinner'); const recoveredSpinner = createSpinnerElement('recovered-spinner'); -function createSpinnerElement(id) { +function createSpinnerElement(id: any) { const wrapperDiv = document.createElement('div'); wrapperDiv.setAttribute('id', id); wrapperDiv.setAttribute( 'class', - 'spinner-wrapper flex justify-center align-center', + 'spinner-wrapper flex justify-center align-center' ); const spinnerDiv = document.createElement('div'); spinnerDiv.setAttribute('class', 'ripple-spinner'); @@ -34,7 +39,7 @@ function createSpinnerElement(id) { // state let isDeathLoading = false; -let isRecoveredLoading = false; +const isRecoveredLoading = false; // api function fetchCovidSummary() { @@ -42,8 +47,14 @@ function fetchCovidSummary() { return axios.get(url); } -function fetchCountryInfo(countryCode, status) { - // params: confirmed, recovered, deaths +enum CovidStatus { + Confirmed = 'confirmed', + Recovered = 'recovered', + Deaths = 'deaths', +} + +function fetchCountryInfo(countryCode: string, status: CovidStatus) { + // status params: confirmed, recovered, deaths const url = `https://api.covid19api.com/country/${countryCode}/status/${status}`; return axios.get(url); } @@ -59,7 +70,7 @@ function initEvents() { rankList.addEventListener('click', handleListClick); } -async function handleListClick(event) { +async function handleListClick(event: any) { let selectedId; if ( event.target instanceof HTMLParagraphElement || @@ -77,14 +88,17 @@ async function handleListClick(event) { clearRecoveredList(); startLoadingAnimation(); isDeathLoading = true; - const { data: deathResponse } = await fetchCountryInfo(selectedId, 'deaths'); + const { data: deathResponse } = await fetchCountryInfo( + selectedId, + CovidStatus.Deaths + ); const { data: recoveredResponse } = await fetchCountryInfo( selectedId, - 'recovered', + CovidStatus.Recovered ); const { data: confirmedResponse } = await fetchCountryInfo( selectedId, - 'confirmed', + CovidStatus.Confirmed ); endLoadingAnimation(); setDeathsList(deathResponse); @@ -95,11 +109,11 @@ async function handleListClick(event) { isDeathLoading = false; } -function setDeathsList(data) { +function setDeathsList(data: any) { const sorted = data.sort( - (a, b) => getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date), + (a: any, b: any) => getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date) ); - sorted.forEach(value => { + sorted.forEach((value: any) => { const li = document.createElement('li'); li.setAttribute('class', 'list-item-b flex align-center'); const span = document.createElement('span'); @@ -117,15 +131,15 @@ function clearDeathList() { deathsList.innerHTML = null; } -function setTotalDeathsByCountry(data) { +function setTotalDeathsByCountry(data: any) { deathsTotal.innerText = data[0].Cases; } -function setRecoveredList(data) { +function setRecoveredList(data: any) { const sorted = data.sort( - (a, b) => getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date), + (a: any, b: any) => getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date) ); - sorted.forEach(value => { + sorted.forEach((value: any) => { const li = document.createElement('li'); li.setAttribute('class', 'list-item-b flex align-center'); const span = document.createElement('span'); @@ -143,7 +157,7 @@ function clearRecoveredList() { recoveredList.innerHTML = null; } -function setTotalRecoveredByCountry(data) { +function setTotalRecoveredByCountry(data: any) { recoveredTotal.innerText = data[0].Cases; } @@ -166,8 +180,8 @@ async function setupData() { setLastUpdatedTimestamp(data); } -function renderChart(data, labels) { - var ctx = $('#lineChart').getContext('2d'); +function renderChart(data: any, labels: any) { + const ctx = $('#lineChart').getContext('2d'); Chart.defaults.global.defaultFontColor = '#f5eaea'; Chart.defaults.global.defaultFontFamily = 'Exo 2'; new Chart(ctx, { @@ -187,40 +201,42 @@ function renderChart(data, labels) { }); } -function setChartData(data) { - const chartData = data.slice(-14).map(value => value.Cases); +function setChartData(data: any) { + const chartData = data.slice(-14).map((value: any) => value.Cases); const chartLabel = data .slice(-14) - .map(value => new Date(value.Date).toLocaleDateString().slice(5, -1)); + .map((value: any) => + new Date(value.Date).toLocaleDateString().slice(5, -1) + ); renderChart(chartData, chartLabel); } -function setTotalConfirmedNumber(data) { +function setTotalConfirmedNumber(data: any) { confirmedTotal.innerText = data.Countries.reduce( - (total, current) => (total += current.TotalConfirmed), - 0, + (total: any, current: any) => (total += current.TotalConfirmed), + 0 ); } -function setTotalDeathsByWorld(data) { +function setTotalDeathsByWorld(data: any) { deathsTotal.innerText = data.Countries.reduce( - (total, current) => (total += current.TotalDeaths), - 0, + (total: any, current: any) => (total += current.TotalDeaths), + 0 ); } -function setTotalRecoveredByWorld(data) { +function setTotalRecoveredByWorld(data: any) { recoveredTotal.innerText = data.Countries.reduce( - (total, current) => (total += current.TotalRecovered), - 0, + (total: any, current: any) => (total += current.TotalRecovered), + 0 ); } -function setCountryRanksByConfirmedCases(data) { +function setCountryRanksByConfirmedCases(data: any) { const sorted = data.Countries.sort( - (a, b) => b.TotalConfirmed - a.TotalConfirmed, + (a: any, b: any) => b.TotalConfirmed - a.TotalConfirmed ); - sorted.forEach(value => { + sorted.forEach((value: any) => { const li = document.createElement('li'); li.setAttribute('class', 'list-item flex align-center'); li.setAttribute('id', value.Slug); @@ -236,7 +252,7 @@ function setCountryRanksByConfirmedCases(data) { }); } -function setLastUpdatedTimestamp(data) { +function setLastUpdatedTimestamp(data: any) { lastUpdatedTime.innerText = new Date(data.Date).toLocaleString(); } diff --git a/project/tsconfig.json b/project/tsconfig.json new file mode 100644 index 00000000..cd287608 --- /dev/null +++ b/project/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "allowJs": true, + "target": "ES5", + "outDir": "./built", + "moduleResolution": "Node", + "lib": ["ES2015", "DOM", "DOM.Iterable"], + "noImplicitAny": true + }, + "include": ["./src/**/*"] +} \ No newline at end of file From 4866b34e7cfa0bb9833e6ee3676e78a6687db826 Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Fri, 27 Nov 2020 11:45:21 +0900 Subject: [PATCH 11/13] add code and note til ts external lib modularization --- project/README.md | 5 ++++ project/package-lock.json | 48 +++++++++++++++++++++++++++++-- project/package.json | 5 +++- project/src/app.ts | 13 +++++---- project/tsconfig.json | 3 +- project/types/chart.js/index.d.ts | 3 ++ setup/README.md | 2 +- 7 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 project/types/chart.js/index.d.ts diff --git a/project/README.md b/project/README.md index 069d983d..d86ac173 100644 --- a/project/README.md +++ b/project/README.md @@ -13,6 +13,11 @@ - [x] `tsc` 명령어로 타입스크립트 컴파일 하기 2. 명시적인 `any` 선언하기 - `tsconfig.json` 파일에 `noImplicitAny` 값을 `true`로 추가 + - 가능한한 구체적인 타입으로 타입 정의 +3. 프로젝트 환경 구성 + - babel, eslint, prettier 등의 환경 설정 +4. 외부 라이브러리 모듈화 + ## 참고 자료 diff --git a/project/package-lock.json b/project/package-lock.json index 03a92e71..e4922083 100644 --- a/project/package-lock.json +++ b/project/package-lock.json @@ -1261,6 +1261,14 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "axios": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.0.tgz", + "integrity": "sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==", + "requires": { + "follow-redirects": "^1.10.0" + } + }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -1341,11 +1349,36 @@ "supports-color": "^5.3.0" } }, + "chart.js": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz", + "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -1353,8 +1386,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "colorette": { "version": "1.2.1", @@ -1793,6 +1825,11 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2071,6 +2108,11 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", diff --git a/project/package.json b/project/package.json index b71ccb68..9728b64b 100644 --- a/project/package.json +++ b/project/package.json @@ -10,7 +10,10 @@ "keywords": [], "author": "", "license": "ISC", - "dependencies": {}, + "dependencies": { + "axios": "^0.21.0", + "chart.js": "^2.9.4" + }, "devDependencies": { "@babel/core": "^7.12.7", "@babel/preset-env": "^7.12.7", diff --git a/project/src/app.ts b/project/src/app.ts index 9a2c4f30..727f7dfb 100644 --- a/project/src/app.ts +++ b/project/src/app.ts @@ -1,4 +1,9 @@ -const sum = (a, b) => a + b; +// // 라이브러리 로딩 +// import 변수명 from '라이브러리 이름'; +// // 변수, 함수 임포트 문법 +// import {} from '파일 상대 경로'; +import axios from 'axios'; +import * as Chart from 'chart.js'; // utils function $(selector: string) { @@ -8,12 +13,10 @@ function getUnixTimestamp(date: Date) { return new Date(date).getTime(); } -const a = 10; - // DOM -let a: Element | HTMLElement | HTMLParagraphElement; +// let a: Element | HTMLElement | HTMLParagraphElement; const confirmedTotal = $('.confirmed-total') as HTMLSpanElement; -const deathsTotal: HTMLParagraphElement = $('.deaths'); +const deathsTotal = $('.deaths') as HTMLParagraphElement; const recoveredTotal = $('.recovered') as HTMLParagraphElement; const lastUpdatedTime = $('.last-updated-time') as HTMLParagraphElement; const rankList = $('.rank-list'); diff --git a/project/tsconfig.json b/project/tsconfig.json index cd287608..fc786aa0 100644 --- a/project/tsconfig.json +++ b/project/tsconfig.json @@ -5,7 +5,8 @@ "outDir": "./built", "moduleResolution": "Node", "lib": ["ES2015", "DOM", "DOM.Iterable"], - "noImplicitAny": true + "noImplicitAny": true, + "typeRoots": ["./node_modules/@types", "./types"] }, "include": ["./src/**/*"] } \ No newline at end of file diff --git a/project/types/chart.js/index.d.ts b/project/types/chart.js/index.d.ts new file mode 100644 index 00000000..26152e67 --- /dev/null +++ b/project/types/chart.js/index.d.ts @@ -0,0 +1,3 @@ +declare module 'chart.js' { + // ... +} diff --git a/setup/README.md b/setup/README.md index e63672d1..280c3562 100644 --- a/setup/README.md +++ b/setup/README.md @@ -74,7 +74,7 @@ node_modules "eslint.validate": [ "javascript", "typescript" - ], + ] } ``` From dd62f7540c5968d21464ad0923c110a75b8494d6 Mon Sep 17 00:00:00 2001 From: CaptainPangyo Date: Sun, 13 Dec 2020 14:56:29 +0900 Subject: [PATCH 12/13] add code til es6 syntax --- project/.eslintignore | 3 +- project/README.md | 1 - project/built/app.js | 259 ------------------------------ project/index.html | 2 +- project/src/app.ts | 94 ++++++----- project/src/covid/index.ts | 44 +++++ project/tsconfig.json | 2 +- project/types/chart.js/index.d.ts | 4 +- 8 files changed, 103 insertions(+), 306 deletions(-) delete mode 100644 project/built/app.js create mode 100644 project/src/covid/index.ts diff --git a/project/.eslintignore b/project/.eslintignore index b512c09d..76add878 100644 --- a/project/.eslintignore +++ b/project/.eslintignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +dist \ No newline at end of file diff --git a/project/README.md b/project/README.md index d86ac173..91f35ac1 100644 --- a/project/README.md +++ b/project/README.md @@ -17,7 +17,6 @@ 3. 프로젝트 환경 구성 - babel, eslint, prettier 등의 환경 설정 4. 외부 라이브러리 모듈화 - ## 참고 자료 diff --git a/project/built/app.js b/project/built/app.js deleted file mode 100644 index bacad4df..00000000 --- a/project/built/app.js +++ /dev/null @@ -1,259 +0,0 @@ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -// utils -function $(selector) { - return document.querySelector(selector); -} -function getUnixTimestamp(date) { - return new Date(date).getTime(); -} -// DOM -var a; -var confirmedTotal = $('.confirmed-total'); -var deathsTotal = $('.deaths'); -var recoveredTotal = $('.recovered'); -var lastUpdatedTime = $('.last-updated-time'); -var rankList = $('.rank-list'); -var deathsList = $('.deaths-list'); -var recoveredList = $('.recovered-list'); -var deathSpinner = createSpinnerElement('deaths-spinner'); -var recoveredSpinner = createSpinnerElement('recovered-spinner'); -function createSpinnerElement(id) { - var wrapperDiv = document.createElement('div'); - wrapperDiv.setAttribute('id', id); - wrapperDiv.setAttribute('class', 'spinner-wrapper flex justify-center align-center'); - var spinnerDiv = document.createElement('div'); - spinnerDiv.setAttribute('class', 'ripple-spinner'); - spinnerDiv.appendChild(document.createElement('div')); - spinnerDiv.appendChild(document.createElement('div')); - wrapperDiv.appendChild(spinnerDiv); - return wrapperDiv; -} -// state -var isDeathLoading = false; -var isRecoveredLoading = false; -// api -function fetchCovidSummary() { - var url = 'https://api.covid19api.com/summary'; - return axios.get(url); -} -var CovidStatus; -(function (CovidStatus) { - CovidStatus["Confirmed"] = "confirmed"; - CovidStatus["Recovered"] = "recovered"; - CovidStatus["Deaths"] = "deaths"; -})(CovidStatus || (CovidStatus = {})); -function fetchCountryInfo(countryCode, status) { - // status params: confirmed, recovered, deaths - var url = "https://api.covid19api.com/country/" + countryCode + "/status/" + status; - return axios.get(url); -} -// methods -function startApp() { - setupData(); - initEvents(); -} -// events -function initEvents() { - rankList.addEventListener('click', handleListClick); -} -function handleListClick(event) { - return __awaiter(this, void 0, void 0, function () { - var selectedId, deathResponse, recoveredResponse, confirmedResponse; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (event.target instanceof HTMLParagraphElement || - event.target instanceof HTMLSpanElement) { - selectedId = event.target.parentElement.id; - } - if (event.target instanceof HTMLLIElement) { - selectedId = event.target.id; - } - if (isDeathLoading) { - return [2 /*return*/]; - } - clearDeathList(); - clearRecoveredList(); - startLoadingAnimation(); - isDeathLoading = true; - return [4 /*yield*/, fetchCountryInfo(selectedId, CovidStatus.Deaths)]; - case 1: - deathResponse = (_a.sent()).data; - return [4 /*yield*/, fetchCountryInfo(selectedId, CovidStatus.Recovered)]; - case 2: - recoveredResponse = (_a.sent()).data; - return [4 /*yield*/, fetchCountryInfo(selectedId, CovidStatus.Confirmed)]; - case 3: - confirmedResponse = (_a.sent()).data; - endLoadingAnimation(); - setDeathsList(deathResponse); - setTotalDeathsByCountry(deathResponse); - setRecoveredList(recoveredResponse); - setTotalRecoveredByCountry(recoveredResponse); - setChartData(confirmedResponse); - isDeathLoading = false; - return [2 /*return*/]; - } - }); - }); -} -function setDeathsList(data) { - var sorted = data.sort(function (a, b) { return getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date); }); - sorted.forEach(function (value) { - var li = document.createElement('li'); - li.setAttribute('class', 'list-item-b flex align-center'); - var span = document.createElement('span'); - span.textContent = value.Cases; - span.setAttribute('class', 'deaths'); - var p = document.createElement('p'); - p.textContent = new Date(value.Date).toLocaleDateString().slice(0, -1); - li.appendChild(span); - li.appendChild(p); - deathsList.appendChild(li); - }); -} -function clearDeathList() { - deathsList.innerHTML = null; -} -function setTotalDeathsByCountry(data) { - deathsTotal.innerText = data[0].Cases; -} -function setRecoveredList(data) { - var sorted = data.sort(function (a, b) { return getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date); }); - sorted.forEach(function (value) { - var li = document.createElement('li'); - li.setAttribute('class', 'list-item-b flex align-center'); - var span = document.createElement('span'); - span.textContent = value.Cases; - span.setAttribute('class', 'recovered'); - var p = document.createElement('p'); - p.textContent = new Date(value.Date).toLocaleDateString().slice(0, -1); - li.appendChild(span); - li.appendChild(p); - recoveredList.appendChild(li); - }); -} -function clearRecoveredList() { - recoveredList.innerHTML = null; -} -function setTotalRecoveredByCountry(data) { - recoveredTotal.innerText = data[0].Cases; -} -function startLoadingAnimation() { - deathsList.appendChild(deathSpinner); - recoveredList.appendChild(recoveredSpinner); -} -function endLoadingAnimation() { - deathsList.removeChild(deathSpinner); - recoveredList.removeChild(recoveredSpinner); -} -function setupData() { - return __awaiter(this, void 0, void 0, function () { - var data; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, fetchCovidSummary()]; - case 1: - data = (_a.sent()).data; - setTotalConfirmedNumber(data); - setTotalDeathsByWorld(data); - setTotalRecoveredByWorld(data); - setCountryRanksByConfirmedCases(data); - setLastUpdatedTimestamp(data); - return [2 /*return*/]; - } - }); - }); -} -function renderChart(data, labels) { - var ctx = $('#lineChart').getContext('2d'); - Chart.defaults.global.defaultFontColor = '#f5eaea'; - Chart.defaults.global.defaultFontFamily = 'Exo 2'; - new Chart(ctx, { - type: 'line', - data: { - labels: labels, - datasets: [ - { - label: 'Confirmed for the last two weeks', - backgroundColor: '#feb72b', - borderColor: '#feb72b', - data: data, - }, - ], - }, - options: {}, - }); -} -function setChartData(data) { - var chartData = data.slice(-14).map(function (value) { return value.Cases; }); - var chartLabel = data - .slice(-14) - .map(function (value) { return new Date(value.Date).toLocaleDateString().slice(5, -1); }); - renderChart(chartData, chartLabel); -} -function setTotalConfirmedNumber(data) { - confirmedTotal.innerText = data.Countries.reduce(function (total, current) { return (total += current.TotalConfirmed); }, 0); -} -function setTotalDeathsByWorld(data) { - deathsTotal.innerText = data.Countries.reduce(function (total, current) { return (total += current.TotalDeaths); }, 0); -} -function setTotalRecoveredByWorld(data) { - recoveredTotal.innerText = data.Countries.reduce(function (total, current) { return (total += current.TotalRecovered); }, 0); -} -function setCountryRanksByConfirmedCases(data) { - var sorted = data.Countries.sort(function (a, b) { return b.TotalConfirmed - a.TotalConfirmed; }); - sorted.forEach(function (value) { - var li = document.createElement('li'); - li.setAttribute('class', 'list-item flex align-center'); - li.setAttribute('id', value.Slug); - var span = document.createElement('span'); - span.textContent = value.TotalConfirmed; - span.setAttribute('class', 'cases'); - var p = document.createElement('p'); - p.setAttribute('class', 'country'); - p.textContent = value.Country; - li.appendChild(span); - li.appendChild(p); - rankList.appendChild(li); - }); -} -function setLastUpdatedTimestamp(data) { - lastUpdatedTime.innerText = new Date(data.Date).toLocaleString(); -} -startApp(); diff --git a/project/index.html b/project/index.html index 90d0ae59..a239c19d 100644 --- a/project/index.html +++ b/project/index.html @@ -54,6 +54,6 @@

Total Recovered

- + diff --git a/project/src/app.ts b/project/src/app.ts index 727f7dfb..edcd9111 100644 --- a/project/src/app.ts +++ b/project/src/app.ts @@ -2,14 +2,21 @@ // import 변수명 from '라이브러리 이름'; // // 변수, 함수 임포트 문법 // import {} from '파일 상대 경로'; -import axios from 'axios'; -import * as Chart from 'chart.js'; +import axios, { AxiosResponse } from 'axios'; +import Chart from 'chart.js'; +// 타입 모듈 +import { + CountrySummaryResponse, + CovidSummaryResponse, + Country, + CountrySummaryInfo, +} from './covid/index'; // utils function $(selector: string) { return document.querySelector(selector); } -function getUnixTimestamp(date: Date) { +function getUnixTimestamp(date: Date | string) { return new Date(date).getTime(); } @@ -25,7 +32,7 @@ const recoveredList = $('.recovered-list'); const deathSpinner = createSpinnerElement('deaths-spinner'); const recoveredSpinner = createSpinnerElement('recovered-spinner'); -function createSpinnerElement(id: any) { +function createSpinnerElement(id: string) { const wrapperDiv = document.createElement('div'); wrapperDiv.setAttribute('id', id); wrapperDiv.setAttribute( @@ -42,10 +49,9 @@ function createSpinnerElement(id: any) { // state let isDeathLoading = false; -const isRecoveredLoading = false; // api -function fetchCovidSummary() { +function fetchCovidSummary(): Promise> { const url = 'https://api.covid19api.com/summary'; return axios.get(url); } @@ -56,9 +62,12 @@ enum CovidStatus { Deaths = 'deaths', } -function fetchCountryInfo(countryCode: string, status: CovidStatus) { +function fetchCountryInfo( + countryName: string, + status: CovidStatus +): Promise> { // status params: confirmed, recovered, deaths - const url = `https://api.covid19api.com/country/${countryCode}/status/${status}`; + const url = `https://api.covid19api.com/country/${countryName}/status/${status}`; return axios.get(url); } @@ -73,7 +82,7 @@ function initEvents() { rankList.addEventListener('click', handleListClick); } -async function handleListClick(event: any) { +async function handleListClick(event: MouseEvent) { let selectedId; if ( event.target instanceof HTMLParagraphElement || @@ -112,15 +121,16 @@ async function handleListClick(event: any) { isDeathLoading = false; } -function setDeathsList(data: any) { +function setDeathsList(data: CountrySummaryResponse) { const sorted = data.sort( - (a: any, b: any) => getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date) + (a: CountrySummaryInfo, b: CountrySummaryInfo) => + getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date) ); - sorted.forEach((value: any) => { + sorted.forEach((value: CountrySummaryInfo) => { const li = document.createElement('li'); li.setAttribute('class', 'list-item-b flex align-center'); const span = document.createElement('span'); - span.textContent = value.Cases; + span.textContent = value.Cases.toString(); span.setAttribute('class', 'deaths'); const p = document.createElement('p'); p.textContent = new Date(value.Date).toLocaleDateString().slice(0, -1); @@ -134,19 +144,20 @@ function clearDeathList() { deathsList.innerHTML = null; } -function setTotalDeathsByCountry(data: any) { - deathsTotal.innerText = data[0].Cases; +function setTotalDeathsByCountry(data: CountrySummaryResponse) { + deathsTotal.innerText = data[0].Cases.toString(); } -function setRecoveredList(data: any) { +function setRecoveredList(data: CountrySummaryResponse) { const sorted = data.sort( - (a: any, b: any) => getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date) + (a: CountrySummaryInfo, b: CountrySummaryInfo) => + getUnixTimestamp(b.Date) - getUnixTimestamp(a.Date) ); - sorted.forEach((value: any) => { + sorted.forEach((value: CountrySummaryInfo) => { const li = document.createElement('li'); li.setAttribute('class', 'list-item-b flex align-center'); const span = document.createElement('span'); - span.textContent = value.Cases; + span.textContent = value.Cases.toString(); span.setAttribute('class', 'recovered'); const p = document.createElement('p'); p.textContent = new Date(value.Date).toLocaleDateString().slice(0, -1); @@ -160,8 +171,8 @@ function clearRecoveredList() { recoveredList.innerHTML = null; } -function setTotalRecoveredByCountry(data: any) { - recoveredTotal.innerText = data[0].Cases; +function setTotalRecoveredByCountry(data: CountrySummaryResponse) { + recoveredTotal.innerText = data[0].Cases.toString(); } function startLoadingAnimation() { @@ -183,8 +194,9 @@ async function setupData() { setLastUpdatedTimestamp(data); } -function renderChart(data: any, labels: any) { - const ctx = $('#lineChart').getContext('2d'); +function renderChart(data: number[], labels: string[]) { + const lineChart = $('#lineChart') as HTMLCanvasElement; + const ctx = lineChart.getContext('2d'); Chart.defaults.global.defaultFontColor = '#f5eaea'; Chart.defaults.global.defaultFontFamily = 'Exo 2'; new Chart(ctx, { @@ -204,47 +216,49 @@ function renderChart(data: any, labels: any) { }); } -function setChartData(data: any) { - const chartData = data.slice(-14).map((value: any) => value.Cases); +function setChartData(data: CountrySummaryResponse) { + const chartData = data + .slice(-14) + .map((value: CountrySummaryInfo) => value.Cases); const chartLabel = data .slice(-14) - .map((value: any) => + .map((value: CountrySummaryInfo) => new Date(value.Date).toLocaleDateString().slice(5, -1) ); renderChart(chartData, chartLabel); } -function setTotalConfirmedNumber(data: any) { +function setTotalConfirmedNumber(data: CovidSummaryResponse) { confirmedTotal.innerText = data.Countries.reduce( - (total: any, current: any) => (total += current.TotalConfirmed), + (total: number, current: Country) => (total += current.TotalConfirmed), 0 - ); + ).toString(); } -function setTotalDeathsByWorld(data: any) { +function setTotalDeathsByWorld(data: CovidSummaryResponse) { deathsTotal.innerText = data.Countries.reduce( - (total: any, current: any) => (total += current.TotalDeaths), + (total: number, current: Country) => (total += current.TotalDeaths), 0 - ); + ).toString(); } -function setTotalRecoveredByWorld(data: any) { +function setTotalRecoveredByWorld(data: CovidSummaryResponse) { recoveredTotal.innerText = data.Countries.reduce( - (total: any, current: any) => (total += current.TotalRecovered), + (total: number, current: Country) => (total += current.TotalRecovered), 0 - ); + ).toString(); } -function setCountryRanksByConfirmedCases(data: any) { +function setCountryRanksByConfirmedCases(data: CovidSummaryResponse) { const sorted = data.Countries.sort( - (a: any, b: any) => b.TotalConfirmed - a.TotalConfirmed + (a: Country, b: Country) => b.TotalConfirmed - a.TotalConfirmed ); - sorted.forEach((value: any) => { + sorted.forEach((value: Country) => { const li = document.createElement('li'); li.setAttribute('class', 'list-item flex align-center'); li.setAttribute('id', value.Slug); const span = document.createElement('span'); - span.textContent = value.TotalConfirmed; + span.textContent = value.TotalConfirmed.toString(); span.setAttribute('class', 'cases'); const p = document.createElement('p'); p.setAttribute('class', 'country'); @@ -255,7 +269,7 @@ function setCountryRanksByConfirmedCases(data: any) { }); } -function setLastUpdatedTimestamp(data: any) { +function setLastUpdatedTimestamp(data: CovidSummaryResponse) { lastUpdatedTime.innerText = new Date(data.Date).toLocaleString(); } diff --git a/project/src/covid/index.ts b/project/src/covid/index.ts new file mode 100644 index 00000000..5a659399 --- /dev/null +++ b/project/src/covid/index.ts @@ -0,0 +1,44 @@ +export interface Country { + Country: string; + CountryCode: string; + Date: string; + NewConfirmed: number; + NewDeaths: number; + NewRecovered: number; + Premium: any; + Slug: string; + TotalConfirmed: number; + TotalDeaths: number; + TotalRecovered: number; +} + +interface Global { + NewConfirmed: number; + NewDeaths: number; + NewRecovered: number; + TotalConfirmed: number; + TotalDeaths: number; + TotalRecovered: number; +} + +export interface CovidSummaryResponse { + Countries: Country[]; + Date: string; + Global: Global; + Message: string; +} + +export interface CountrySummaryInfo { + Cases: number; + City: string; + CityCode: string; + Country: string; + CountryCode: string; + Date: string; + Lat: string; + Lon: string; + Province: string; + Status: string; +} + +export type CountrySummaryResponse = CountrySummaryInfo[]; diff --git a/project/tsconfig.json b/project/tsconfig.json index fc786aa0..ed93f86c 100644 --- a/project/tsconfig.json +++ b/project/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "allowJs": true, "target": "ES5", - "outDir": "./built", + "outDir": "./dist", "moduleResolution": "Node", "lib": ["ES2015", "DOM", "DOM.Iterable"], "noImplicitAny": true, diff --git a/project/types/chart.js/index.d.ts b/project/types/chart.js/index.d.ts index 26152e67..7c602671 100644 --- a/project/types/chart.js/index.d.ts +++ b/project/types/chart.js/index.d.ts @@ -1,3 +1 @@ -declare module 'chart.js' { - // ... -} +declare module 'chart.js'; From e63e5e610c13a0c6651e61a5e32501361768364b Mon Sep 17 00:00:00 2001 From: joshua1988 Date: Wed, 27 Jan 2021 21:15:23 +0900 Subject: [PATCH 13/13] add code to bundle the whole application to fix the module loading error --- project/index.html | 2 +- project/package-lock.json | 1283 ++++++++++++++++++++++++++++++++++++- project/package.json | 9 +- project/tsconfig.json | 1 + project/webpack.config.js | 22 + 5 files changed, 1305 insertions(+), 12 deletions(-) create mode 100644 project/webpack.config.js diff --git a/project/index.html b/project/index.html index a239c19d..d412b905 100644 --- a/project/index.html +++ b/project/index.html @@ -54,6 +54,6 @@

Total Recovered

- + diff --git a/project/package-lock.json b/project/package-lock.json index e4922083..2fc4a4a6 100644 --- a/project/package-lock.json +++ b/project/package-lock.json @@ -1029,6 +1029,12 @@ "to-fast-properties": "^2.0.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, "@eslint/eslintrc": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", @@ -1090,12 +1096,145 @@ "fastq": "^1.6.0" } }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/chart.js": { + "version": "2.9.30", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.30.tgz", + "integrity": "sha512-EgjxUUZFvf6ls3kW2CwyrnSJhgyKxgwrlp/W5G9wqyPEO9iFatO63zAA7L24YqgMxiDjQ+tG7ODU+2yWH91lPg==", + "dev": true, + "requires": { + "moment": "^2.10.2" + } + }, + "@types/eslint": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", + "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", + "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.41.26", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz", + "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "@typescript-eslint/eslint-plugin": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.1.tgz", @@ -1195,6 +1334,185 @@ "eslint-visitor-keys": "^2.0.0" } }, + "@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.0.tgz", + "integrity": "sha512-Un0SdBoN1h4ACnIO7EiCjWuyhNI0Jl96JC+63q6xi4HDUYRZn8Auluea9D+v9NWKc5J4sICVEltdBaVjLX39xw==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", + "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.2.tgz", + "integrity": "sha512-03GkWxcgFfm8+WIwcsqJb9agrSDNDDoxaNnexPnCCexP5SCE4IgFd9lNpSy+K2nFqVMpgTFw6SwbmVAVTndVew==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -1219,6 +1537,12 @@ "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1255,6 +1579,12 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -1284,6 +1614,12 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1316,6 +1652,12 @@ "node-releases": "^1.1.66" } }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "call-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", @@ -1375,6 +1717,36 @@ "color-name": "^1.0.0" } }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "requires": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1394,6 +1766,12 @@ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", "dev": true }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1427,6 +1805,12 @@ } } }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1462,6 +1846,53 @@ "object-keys": "^1.0.12" } }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1492,6 +1923,22 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -1501,6 +1948,27 @@ "ansi-colors": "^4.1.1" } }, + "envinfo": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", + "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-module-lexer": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", + "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1743,6 +2211,29 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1781,6 +2272,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, "fastq": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", @@ -1808,6 +2305,16 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -1865,6 +2372,12 @@ "has-symbols": "^1.0.1" } }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -1888,6 +2401,12 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -1908,6 +2427,12 @@ "slash": "^3.0.0" } }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1929,6 +2454,12 @@ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -1945,6 +2476,64 @@ "resolve-from": "^4.0.0" } }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -1967,6 +2556,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, "is-core-module": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", @@ -2003,17 +2598,96 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "3.14.0", @@ -2031,6 +2705,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2052,6 +2732,12 @@ "minimist": "^1.2.5" } }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2062,12 +2748,63 @@ "type-check": "~0.4.0" } }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2084,6 +2821,27 @@ "picomatch": "^2.0.5" } }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, + "requires": { + "mime-db": "1.45.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2125,12 +2883,33 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node-releases": { "version": "1.1.67", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", "dev": true }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -2158,6 +2937,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -2172,6 +2960,36 @@ "word-wrap": "^1.2.3" } }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -2181,12 +2999,24 @@ "callsites": "^3.0.0" } }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2211,6 +3041,36 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2232,18 +3092,63 @@ "fast-diff": "^1.1.2" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -2327,6 +3232,23 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2360,12 +3282,41 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2381,6 +3332,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2398,12 +3355,36 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2438,6 +3419,15 @@ } } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -2447,6 +3437,12 @@ "ansi-regex": "^5.0.0" } }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2474,6 +3470,53 @@ "string-width": "^3.0.0" } }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", + "dev": true, + "requires": { + "jest-worker": "^26.6.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2495,6 +3538,96 @@ "is-number": "^7.0.0" } }, + "ts-loader": { + "version": "8.0.14", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.14.tgz", + "integrity": "sha512-Jt/hHlUnApOZjnSjTmZ+AbD5BGlQFx3f1D0nYuNKwz0JJnuDGHJas6az+FlWKwwRTu+26GXpv249A8UAnYUpqA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -2568,12 +3701,126 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, "v8-compile-cache": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, + "watchpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz", + "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.18.0.tgz", + "integrity": "sha512-RmiP/iy6ROvVe/S+u0TrvL/oOmvP+2+Bs8MWjvBwwY/j82Q51XJyDJ75m0QAGntL1Wx6B//Xc0+4VPP/hlNHmw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.46", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.3.26", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "pkg-dir": "^5.0.0", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.1", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.4.0.tgz", + "integrity": "sha512-/Qh07CXfXEkMu5S8wEpjuaw2Zj/CC0hf/qbTDp6N8N7JjdGuaOjZ7kttz+zhuJO/J5m7alQEhNk9lsc4rC6xgQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.0", + "@webpack-cli/info": "^1.2.1", + "@webpack-cli/serve": "^1.2.2", + "colorette": "^1.2.1", + "commander": "^6.2.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "requires": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2583,6 +3830,12 @@ "isexe": "^2.0.0" } }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -2603,6 +3856,18 @@ "requires": { "mkdirp": "^0.5.1" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/project/package.json b/project/package.json index 9728b64b..23f64aed 100644 --- a/project/package.json +++ b/project/package.json @@ -5,7 +5,7 @@ "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "build": "tsc" + "build": "webpack" }, "keywords": [], "author": "", @@ -18,11 +18,16 @@ "@babel/core": "^7.12.7", "@babel/preset-env": "^7.12.7", "@babel/preset-typescript": "^7.12.7", + "@types/chart.js": "^2.9.30", "@typescript-eslint/eslint-plugin": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", + "clean-webpack-plugin": "^3.0.0", "eslint": "^7.14.0", "eslint-plugin-prettier": "^3.1.4", "prettier": "^2.2.0", - "typescript": "^4.1.2" + "ts-loader": "^8.0.14", + "typescript": "^4.1.2", + "webpack": "^5.18.0", + "webpack-cli": "^4.4.0" } } diff --git a/project/tsconfig.json b/project/tsconfig.json index ed93f86c..35223bf9 100644 --- a/project/tsconfig.json +++ b/project/tsconfig.json @@ -6,6 +6,7 @@ "moduleResolution": "Node", "lib": ["ES2015", "DOM", "DOM.Iterable"], "noImplicitAny": true, + "esModuleInterop": true, "typeRoots": ["./node_modules/@types", "./types"] }, "include": ["./src/**/*"] diff --git a/project/webpack.config.js b/project/webpack.config.js new file mode 100644 index 00000000..d9e67e13 --- /dev/null +++ b/project/webpack.config.js @@ -0,0 +1,22 @@ +const path = require('path'); +const webpack = require('webpack'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); + +module.exports = { + mode: 'production', + entry: './src/app.ts', + output: { + filename: 'app.js', + path: path.resolve(__dirname, 'dist'), + }, + module: { + rules: [ + { + test: /\.ts$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + ], + }, + plugins: [new webpack.ProgressPlugin(), new CleanWebpackPlugin()], +};