From d3c7c5a584f4210a7b2fef541055dd1d83c103b6 Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Tue, 10 Sep 2024 17:09:02 +0900 Subject: [PATCH 01/11] second --- "\352\271\200\353\217\231\354\227\260/ex2.js" | 29 ++++++++++++++++++- .../ex2.test.js" | 10 ++++--- "\352\271\200\353\217\231\354\227\260/ex3.js" | 3 ++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git "a/\352\271\200\353\217\231\354\227\260/ex2.js" "b/\352\271\200\353\217\231\354\227\260/ex2.js" index 6b95f04..2da6b79 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex2.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex2.js" @@ -1,4 +1,31 @@ // range 함수를 작성하세요. -const range = (start, end, step = start > end ? -1 : 1) => { }; +const range = (start, end, step = start > end ? -1 : 1) => { + const result = []; + if(step === 0 || start === end){ // start값과 end 값이 같다면 + return [start]; + }if((start > end && step >= 0) || (start < end && step <= 0)){ + return []; + } + + if(end === undefined){ // 만약 end 값이 비어 있다면 + if(start > 0){ + end = start; + start = 1; + } + else if(start < 0){ + end = -1; + } + else{ + return [0]; + } + + } // 이 부분 코드 예쁘게 고치기 + + + // 소수점.. 처리 입실론? + for(let i = start; (step > 0) ? i <= end : i >= end; i+= step){ + result.push(i); + } + return result; module.exports = { range }; diff --git "a/\352\271\200\353\217\231\354\227\260/ex2.test.js" "b/\352\271\200\353\217\231\354\227\260/ex2.test.js" index cbdb2e8..099ec5e 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex2.test.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex2.test.js" @@ -23,24 +23,26 @@ assert.deepStrictEqual(range(0, -3), [0, -1, -2, -3]); assert.deepStrictEqual(range(5, 1), [5, 4, 3, 2, 1]); assert.deepStrictEqual(range(10, 1, -2), [10, 8, 6, 4, 2]); -assert.deepStrictEqual(range(5), [1, 2, 3, 4, 5]); -assert.deepStrictEqual(range(0), [0]); +assert.deepStrictEqual(range(5), [1, 2, 3, 4, 5]); // 오류 +assert.deepStrictEqual(range(0), [0]); // 오류 assert.deepStrictEqual(range(0, 0), [0]); assert.deepStrictEqual(range(2, 1, -5), [2]); assert.deepStrictEqual(range(0, -1, -5), [0]); -assert.deepStrictEqual(range(-5), [-5, -4, -3, -2, -1]); +assert.deepStrictEqual(range(-5), [-5, -4, -3, -2, -1]); // f assert.deepStrictEqual( range(50), Array.from({ length: 50 }, (_, i) => i + 1) ); + assert.deepStrictEqual( range(1, 150, 3), Array.from({ length: 50 }, (_, i) => i * 3 + 1) ); + assert.deepStrictEqual( range(1, 2, 0.1), [1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2] -); +); // 소수점 처리 console.log(range(1, 2, 0.1)); diff --git "a/\352\271\200\353\217\231\354\227\260/ex3.js" "b/\352\271\200\353\217\231\354\227\260/ex3.js" index b1b0d75..6d5a98d 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex3.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex3.js" @@ -1,3 +1,6 @@ Array.prototype.sortBy = function (sortProp = '') { + + + return this; }; From 056790d198fede533dfeb7081f9da22405fbec2a Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Wed, 11 Sep 2024 23:52:17 +0900 Subject: [PATCH 02/11] 0911 --- "\352\271\200\353\217\231\354\227\260/ex2.js" | 25 ++-- .../ex2.test.js" | 8 +- "\352\271\200\353\217\231\354\227\260/ex3.js" | 12 +- .../ex3.test.js" | 7 +- "\352\271\200\353\217\231\354\227\260/ex4.js" | 107 +++++++++++++++++- .../ex4.test.js" | 7 +- "\352\271\200\353\217\231\354\227\260/ex5.js" | 28 ++++- 7 files changed, 173 insertions(+), 21 deletions(-) diff --git "a/\352\271\200\353\217\231\354\227\260/ex2.js" "b/\352\271\200\353\217\231\354\227\260/ex2.js" index 2da6b79..74612c2 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex2.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex2.js" @@ -1,12 +1,14 @@ // range 함수를 작성하세요. const range = (start, end, step = start > end ? -1 : 1) => { const result = []; + if(step === 0 || start === end){ // start값과 end 값이 같다면 return [start]; - }if((start > end && step >= 0) || (start < end && step <= 0)){ + } + + if((start > end && step > 0) || (start < end && step < 0)){ return []; } - if(end === undefined){ // 만약 end 값이 비어 있다면 if(start > 0){ end = start; @@ -17,15 +19,22 @@ const range = (start, end, step = start > end ? -1 : 1) => { } else{ return [0]; - } - + } } // 이 부분 코드 예쁘게 고치기 + // if (end === undefined) { + // end = start; + // start = start > 0 ? 1 : 0; + // } // 개선책인데, 오류... + - // 소수점.. 처리 입실론? - for(let i = start; (step > 0) ? i <= end : i >= end; i+= step){ - result.push(i); + + // 소수점 연산을 위해 EPSILON값 추가 + for(let i = start; (step > 0) ? i < end + (Number.EPSILON * 100) : i >= end - (Number.EPSILON * 100); i += step){ + result.push(Math.round((i + Number.EPSILON) * 100) / 100); } return result; -module.exports = { range }; +}; + +module.exports = { range }; \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex2.test.js" "b/\352\271\200\353\217\231\354\227\260/ex2.test.js" index 099ec5e..94d30cd 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex2.test.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex2.test.js" @@ -23,12 +23,12 @@ assert.deepStrictEqual(range(0, -3), [0, -1, -2, -3]); assert.deepStrictEqual(range(5, 1), [5, 4, 3, 2, 1]); assert.deepStrictEqual(range(10, 1, -2), [10, 8, 6, 4, 2]); -assert.deepStrictEqual(range(5), [1, 2, 3, 4, 5]); // 오류 -assert.deepStrictEqual(range(0), [0]); // 오류 +assert.deepStrictEqual(range(5), [1, 2, 3, 4, 5]); +assert.deepStrictEqual(range(0), [0]); assert.deepStrictEqual(range(0, 0), [0]); assert.deepStrictEqual(range(2, 1, -5), [2]); assert.deepStrictEqual(range(0, -1, -5), [0]); -assert.deepStrictEqual(range(-5), [-5, -4, -3, -2, -1]); // f +assert.deepStrictEqual(range(-5), [-5, -4, -3, -2, -1]); assert.deepStrictEqual( range(50), Array.from({ length: 50 }, (_, i) => i + 1) @@ -46,3 +46,5 @@ assert.deepStrictEqual( ); // 소수점 처리 console.log(range(1, 2, 0.1)); + + diff --git "a/\352\271\200\353\217\231\354\227\260/ex3.js" "b/\352\271\200\353\217\231\354\227\260/ex3.js" index 6d5a98d..000dc92 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex3.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex3.js" @@ -1,6 +1,14 @@ Array.prototype.sortBy = function (sortProp = '') { + const commands = sortProp.split(',').map(item => item.split(':')); + return this.slice().sort((a, b) => { + for (const [key, order] of commands) { + if (a[key] > b[key]) return order === 'desc' ? -1 : 1; + if (a[key] < b[key]) return order === 'desc' ? 1 : -1; + } + return 0; + }); - - return this; }; + +// default 값은 asc \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex3.test.js" "b/\352\271\200\353\217\231\354\227\260/ex3.test.js" index 6c27a4d..e11023c 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex3.test.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex3.test.js" @@ -1,3 +1,4 @@ +// 수정된 테스트 코드 const assert = require('assert'); require('./ex3'); @@ -8,11 +9,11 @@ const users = [lee, hong, kim]; assert.deepStrictEqual(users.sortBy('id'), [hong, kim, lee]); assert.deepStrictEqual(users.sortBy('name:desc'), [lee, kim, hong]); -assert.deepStrictEqual(users.sortBy('dept:desc,city:asc'), [hong, lee, kim]); +assert.deepStrictEqual(users.sortBy('dept:desc,city:asc'), [lee, kim, hong]); assert.deepStrictEqual(users.sortBy('dept:desc,city:desc'), [kim, lee, hong]); assert.deepStrictEqual(users.sortBy('name:desc,id:,dept:desc'), [ - kim, lee, + kim, hong, ]); -assert.deepStrictEqual(users.sortBy('dept:desc,id'), [hong, kim, lee]); +assert.deepStrictEqual(users.sortBy('dept:desc,id'), [kim, lee, hong]); diff --git "a/\352\271\200\353\217\231\354\227\260/ex4.js" "b/\352\271\200\353\217\231\354\227\260/ex4.js" index 9ede02f..a970954 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex4.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex4.js" @@ -1,3 +1,108 @@ -function deepCopy(obj) {} +function deepCopy(obj) { + let wm = new WeakMap(); //recursiob 방지 + let copy; + // 순환참조 방지 -> .has사용 + if(wm.has(obj)){ + return wm.get(obj) + } + + // 객체, null 값 경우 그대로 반환 + if(typeof obj !== "object" || obj === null){ + return obj; //primitve타입 처리방법 + } + + // 배열일 경우 + if(Array.isArray(obj)){ + copy = []; + wm.set(obj, copy); + for(let i = 0; i < obj.length; i++){ + copy[i] = deepCopy(obj[i], wm); + } + return copy; + } + + // Set + else if(obj instanceof Set){ + copy = new Set(); + wm.set(obj, copy); + obj.forEach((value =>{ + copy.add(deepCopy(value, wm)); + })); + return copy; + } + + // WeakSet, WeakMap 처리 (복사 불가) + if (obj instanceof WeakSet || obj instanceof WeakMap) { + return obj; // 복사 불가하므로 원본 반환 + } + + + // // WeakSet + // else if(obj instanceof Set){ + // copy = new WeakSet(); + // wm.set(obj, copy); + // obj.forEach((value =>{ + // copy.add(deepCopy(value, wm)); + // })); + // return copy; + // } + + // Map + else if(obj instanceof Map){ + copy = new Map(); + wm.set(obj, copy); + obj.forEach((key, value) =>{ + copy.set(deepCopy(key, wm), deepCopy(value, wm)); + }); + return copy; + } + + // // WeakMap + // else if(obj instanceof Map){ + // copy = new WeakMap(); + // wm.set(obj, copy); + // obj.forEach((key,value) =>{ + // copy.set(deepCopy(key, wm), deepCopy(value, wm)); + // }); + // return copy; + // } + + // Date 객체 복사 + if (obj instanceof Date) + return new Date(obj); + + // RegExp 객체 복사 + if (obj instanceof RegExp) + return new RegExp(obj); + + + // 객체의 복사 + const result = Array.isArray(obj) ? [] : Object.create(Object.getPrototypeOf(obj)); + wm.set(obj, result); // 순환 참조 방지에 기록 + + // Symbol을 포함한 모든 속성 복사 + Reflect.ownKeys(obj).forEach(key => { + result[key] = deepCopy(obj[key], wm); + }); + return result; + + + + // 객체 + // else { + // copy = {}; + // wm.set(obj,copy); + // for (let key in obj) { + // if (obj.hasOwnProperty(key)) { + // copy[key] = deepCopy(obj[key]); // 객체의 깊이만큼 복사 (재귀) + // } + // } + // return copy; + // } + +} module.exports = { deepCopy }; + + + diff --git "a/\352\271\200\353\217\231\354\227\260/ex4.test.js" "b/\352\271\200\353\217\231\354\227\260/ex4.test.js" index 2699ce8..413ac27 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex4.test.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex4.test.js" @@ -24,7 +24,12 @@ const kim = { zwm: new WeakMap([[hong, arr]]), }; const newKim = deepCopy(kim); -assert.deepStrictEqual(newKim, kim, 'deepCopy equal fail!'); + +console.log(JSON.stringify(kim, null, 3)); +console.log(JSON.stringify(newKim, null, 3)); + + +assert.deepStrictEqual(newKim, kim, 'deepCopy equal fail!'); //이것만 오류난다. newKim.addr = 'Daegu'; newKim.oo.name = 'Kim'; assert.notDeepStrictEqual(newKim, kim, 'Not Valid Deep Copy!'); diff --git "a/\352\271\200\353\217\231\354\227\260/ex5.js" "b/\352\271\200\353\217\231\354\227\260/ex5.js" index 464a05a..e370b2a 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex5.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex5.js" @@ -1,3 +1,25 @@ -module.exports = { - searchByKoreanInitialSound: (data, firstSounds) => {}, -}; +// module.exports = { +// searchByKoreanInitialSound: (data, firstSounds) => {}, +// }; + + +// 과제 중 일부인 연습문제 +// 정규표현식 + +// 안타깝게도 정규표현식이 아님 +// https://goni9071.tistory.com/164 + +let s = ['강원도 고성군', '고성군 토성면', '토성면 북면', '북면', '김1수']; + +function getInital(arr){ // 초성만 파싱 + let inital = ''; + for(let i = 0; i < arr.length; i++){ + let idx = ((arr.charCodeAt(i) - 44032) /28) / 21; + if(idx >= 0){ + inital += String.fromCharCode(idx + 4352); + } + } + return inital; +} + +console.log(getInital(s)); From 7f72eefc470674e0c34d0fc5e6eef1587fc131b8 Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Thu, 12 Sep 2024 15:37:23 +0900 Subject: [PATCH 03/11] 0912_alpaco --- "\352\271\200\353\217\231\354\227\260/ex3.js" | 2 - .../ex4.test.js" | 1 + "\352\271\200\353\217\231\354\227\260/ex5.js" | 76 ++++++++++++++----- 3 files changed, 59 insertions(+), 20 deletions(-) diff --git "a/\352\271\200\353\217\231\354\227\260/ex3.js" "b/\352\271\200\353\217\231\354\227\260/ex3.js" index 000dc92..39db32c 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex3.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex3.js" @@ -10,5 +10,3 @@ Array.prototype.sortBy = function (sortProp = '') { }); }; - -// default 값은 asc \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex4.test.js" "b/\352\271\200\353\217\231\354\227\260/ex4.test.js" index 413ac27..1c87ce0 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex4.test.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex4.test.js" @@ -23,6 +23,7 @@ const kim = { zm: new Map([[hong, arr]]), zwm: new WeakMap([[hong, arr]]), }; + const newKim = deepCopy(kim); console.log(JSON.stringify(kim, null, 3)); diff --git "a/\352\271\200\353\217\231\354\227\260/ex5.js" "b/\352\271\200\353\217\231\354\227\260/ex5.js" index e370b2a..a9c805f 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex5.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex5.js" @@ -1,25 +1,65 @@ -// module.exports = { -// searchByKoreanInitialSound: (data, firstSounds) => {}, -// }; +function convertInitialsToHangul(initials) { + // 초성 유니코드 문자와 초성 유니코드의 매핑 + const initialMap = { + 'ᄀ': 'ㄱ', 'ᄁ': 'ㄲ', 'ᄂ': 'ㄴ', 'ᄃ': 'ㄷ', 'ᄄ': 'ㄸ', + 'ᄅ': 'ㄹ', 'ᄆ': 'ㅁ', 'ᄇ': 'ㅂ', 'ᄈ': 'ㅃ', 'ᄉ': 'ㅅ', + 'ᄊ': 'ㅆ', 'ᄋ': 'ㅇ', 'ᄌ': 'ㅈ', 'ᄍ': 'ㅉ', 'ᄎ': 'ㅊ', + 'ᄏ': 'ㅋ', 'ᄐ': 'ㅌ', 'ᄑ': 'ㅍ', 'ᄒ': 'ㅎ' + }; + return initials.split('').map(char => initialMap[char] || char).join(''); +} -// 과제 중 일부인 연습문제 -// 정규표현식 - -// 안타깝게도 정규표현식이 아님 -// https://goni9071.tistory.com/164 - -let s = ['강원도 고성군', '고성군 토성면', '토성면 북면', '북면', '김1수']; +function getInitials(arr) { // 초성만 파싱 + let initials = ''; + for (let i = 0; i < arr.length; i++) { + let charCode = arr.charCodeAt(i); -function getInital(arr){ // 초성만 파싱 - let inital = ''; - for(let i = 0; i < arr.length; i++){ - let idx = ((arr.charCodeAt(i) - 44032) /28) / 21; - if(idx >= 0){ - inital += String.fromCharCode(idx + 4352); + if (charCode >= 44032 && charCode <= 55203) { + let idx = Math.floor((charCode - 44032) / (21 * 28)); // 초성 추출 + initials += String.fromCharCode(idx + 4352); // 초성 유니코드 변환 + } else { + initials += arr[i]; // 숫자나 문자는 그대로 추가 } } - return inital; + return convertInitialsToHangul(initials); // 변환된 초성 문자를 한글 초성 문자로 반환 +} + +// 여러 문자열에서 초성 추출하는 함수 +function extractInitials(data) { + return data.map(getInitials); // 각 문자열의 초성을 배열로 반환 } -console.log(getInital(s)); +module.exports = { + searchByKoreanInitialSound: (data, firstSounds) => { + let result = []; // 결과값 저장소 + + // 각 데이터의 초성을 추출하여 비교 + const initialsData = extractInitials(data); // 데이터를 초성으로 변환한 배열 + + // 입력받은 firstSounds로부터 정규표현식 생성 + const pattern = firstSounds.split('').map(c => { + if (/[ㄱ-ㅎ]/.test(c)) { + return c; // 한글 초성일 경우 그대로 사용 + } + else if (/\d/.test(c)) { + return `${c}`; // 숫자일 경우 이스케이프 처리 + } + else { + return `\\${c}`; // 숫자나 다른 문자는 이스케이프 처리 + } + }).join(''); // 패턴 사이에 '.*' 추가하여 유연한 매칭 + + // 초성이 문자열 내 어디에든 있을 수 있도록 정규표현식 생성 + const regex = new RegExp(pattern); + + // 데이터와 초성 데이터를 비교 + data.forEach((item, index) => { + if (regex.test(initialsData[index])) { + result.push(item); // 초성이 입력값으로 일치하면 결과에 추가 + } + }); + + return result; // 필터링된 결과 반환 + }, +}; From e68cb196c687913a65668659d56aa1dc63aa25c3 Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Thu, 12 Sep 2024 17:01:26 +0900 Subject: [PATCH 04/11] 0912_second --- package.json | 5 +- .../ex1/book-edit.html" | 65 +++++++++++++++++++ .../ex1/index.html" | 12 ++++ .../ex1/register.html" | 12 ++++ 4 files changed, 93 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c356ea8..5c11e4a 100644 --- a/package.json +++ b/package.json @@ -11,5 +11,8 @@ "TS" ], "author": "indiflex", - "license": "ISC" + "license": "ISC", + "devDependencies": { + "tailwindcss": "^3.4.11" + } } diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" index e69de29..6b6989b 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" @@ -0,0 +1,65 @@ + + + + + + + 북마크 + + + + + + + + + + + + + \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/index.html" "b/\352\271\200\353\217\231\354\227\260/ex1/index.html" index e69de29..1599551 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/index.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/index.html" @@ -0,0 +1,12 @@ + + + + + + + Document + + + + + \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" index e69de29..96ec8fe 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From 70528bc36376c985a57de3e975250bbe7e0c113c Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Thu, 12 Sep 2024 17:36:13 +0900 Subject: [PATCH 05/11] 0912_third --- .../ex1/book-edit.html" | 77 ++++++++++++++++--- .../ex1/register.html" | 55 +++++++++++++ 2 files changed, 121 insertions(+), 11 deletions(-) diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" index 6b6989b..f2753b3 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" @@ -45,19 +45,74 @@ +
+
+
+ +
+

Search

+ +
+ +
+ +
+
+

Results

+
+ +
+
+ +
+

Card 1

+

Content for card 1.

+
+ +
+

Card 2

+

Content for card 2.

+
+ +
+

Card 3

+

Content for card 3.

+
+ +
+

Card 4

+

Content for card 4.

+
+ +
+

Card 5

+

Content for card 5.

+
- - + +
+
- + + +
+ +
+
+
+ diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" index 96ec8fe..9dfabc5 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" @@ -7,6 +7,61 @@ +
+
+ + logo + HANA + + + +
+
+

+ Create account +

+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ + +
+ + + +
+
+ +
+
+ +
+
+ + + +

+ Already have an account? Login here +

+
+
+
+
+
+ \ No newline at end of file From 277243a724f1b65a07e341b1ceb68354ef4dab14 Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Thu, 12 Sep 2024 17:48:23 +0900 Subject: [PATCH 06/11] 0912_alpaco_final --- "\352\271\200\353\217\231\354\227\260/ex1/register.html" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" index 9dfabc5..7b7a5c0 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" @@ -53,9 +53,10 @@

Create an account -

+

Already have an account? Login here

+ From 1ff95f309f49fc158a786fbebb14e42ab26d7cce Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Thu, 12 Sep 2024 23:27:18 +0900 Subject: [PATCH 07/11] 0912_home_ver1 --- "\352\271\200\353\217\231\354\227\260/ex4.js" | 85 ++++++------------- .../ex4.test.js" | 5 -- 2 files changed, 24 insertions(+), 66 deletions(-) diff --git "a/\352\271\200\353\217\231\354\227\260/ex4.js" "b/\352\271\200\353\217\231\354\227\260/ex4.js" index a970954..f4160de 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex4.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex4.js" @@ -1,6 +1,7 @@ function deepCopy(obj) { - let wm = new WeakMap(); //recursiob 방지 + let wm = new WeakMap(); //recursive 방지 let copy; + // 순환참조 방지 -> .has사용 if(wm.has(obj)){ return wm.get(obj) @@ -11,7 +12,7 @@ function deepCopy(obj) { return obj; //primitve타입 처리방법 } - // 배열일 경우 + // Array if(Array.isArray(obj)){ copy = []; wm.set(obj, copy); @@ -22,7 +23,7 @@ function deepCopy(obj) { } // Set - else if(obj instanceof Set){ + if(obj instanceof Set){ copy = new Set(); wm.set(obj, copy); obj.forEach((value =>{ @@ -31,78 +32,40 @@ function deepCopy(obj) { return copy; } - // WeakSet, WeakMap 처리 (복사 불가) - if (obj instanceof WeakSet || obj instanceof WeakMap) { - return obj; // 복사 불가하므로 원본 반환 + // WeakSet (직접 접근) + if (obj instanceof WeakSet) { + copy = new WeakSet(); + wm.set(obj, copy); + return copy; } - - // // WeakSet - // else if(obj instanceof Set){ - // copy = new WeakSet(); - // wm.set(obj, copy); - // obj.forEach((value =>{ - // copy.add(deepCopy(value, wm)); - // })); - // return copy; - // } - // Map - else if(obj instanceof Map){ + if(obj instanceof Map){ copy = new Map(); wm.set(obj, copy); - obj.forEach((key, value) =>{ + obj.forEach((value, key) =>{ copy.set(deepCopy(key, wm), deepCopy(value, wm)); }); return copy; } - // // WeakMap - // else if(obj instanceof Map){ - // copy = new WeakMap(); - // wm.set(obj, copy); - // obj.forEach((key,value) =>{ - // copy.set(deepCopy(key, wm), deepCopy(value, wm)); - // }); - // return copy; - // } - - // Date 객체 복사 - if (obj instanceof Date) - return new Date(obj); - - // RegExp 객체 복사 - if (obj instanceof RegExp) - return new RegExp(obj); - + // WeakMap (직접 접근) + if (obj instanceof WeakMap) { + copy = new WeakMap(); + wm.set(obj, copy); + return copy; + } - // 객체의 복사 - const result = Array.isArray(obj) ? [] : Object.create(Object.getPrototypeOf(obj)); - wm.set(obj, result); // 순환 참조 방지에 기록 + // 일반 객체 + copy = Object.create(Object.getPrototypeOf(obj)); + wm.set(obj, copy); - // Symbol을 포함한 모든 속성 복사 + // 모든 속성 Reflect.ownKeys(obj).forEach(key => { - result[key] = deepCopy(obj[key], wm); + copy[key] = deepCopy(obj[key], wm); }); - return result; - - - // 객체 - // else { - // copy = {}; - // wm.set(obj,copy); - // for (let key in obj) { - // if (obj.hasOwnProperty(key)) { - // copy[key] = deepCopy(obj[key]); // 객체의 깊이만큼 복사 (재귀) - // } - // } - // return copy; - // } + return copy; } - -module.exports = { deepCopy }; - - - +module.exports = { deepCopy }; \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex4.test.js" "b/\352\271\200\353\217\231\354\227\260/ex4.test.js" index 1c87ce0..dda899a 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex4.test.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex4.test.js" @@ -25,11 +25,6 @@ const kim = { }; const newKim = deepCopy(kim); - -console.log(JSON.stringify(kim, null, 3)); -console.log(JSON.stringify(newKim, null, 3)); - - assert.deepStrictEqual(newKim, kim, 'deepCopy equal fail!'); //이것만 오류난다. newKim.addr = 'Daegu'; newKim.oo.name = 'Kim'; From 166d0152c30fbbaa22783177716fd22b6334adbb Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Fri, 13 Sep 2024 02:14:46 +0900 Subject: [PATCH 08/11] 0912_last --- .../ex1/book-edit.html" | 158 ++++++------------ .../ex1/index.html" | 113 +++++++++++++ .../ex1/register.html" | 60 ++++--- "\352\271\200\353\217\231\354\227\260/ex2.js" | 12 +- "\352\271\200\353\217\231\354\227\260/ex3.js" | 1 - "\352\271\200\353\217\231\354\227\260/ex5.js" | 8 +- 6 files changed, 202 insertions(+), 150 deletions(-) diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" index f2753b3..390af23 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" @@ -4,117 +4,69 @@ - 북마크 + Bookmark Manager - - -
-
-
- -
-

Search

- -
- -
- -
-
-

Results

-
- -
-
- -
-

Card 1

-

Content for card 1.

-
- -
-

Card 2

-

Content for card 2.

-
- -
-

Card 3

-

Content for card 3.

-
- -
-

Card 4

-

Content for card 4.

-
- -
-

Card 5

-

Content for card 5.

-
- -
-
+ +
+ + + - -
- -
-
- - +
+

There is no marks.

+ + +
+ +
+ + +
+

© Hanaro 2024 Kim-DongYeon

+
\ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/index.html" "b/\352\271\200\353\217\231\354\227\260/ex1/index.html" index 1599551..06a69c0 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/index.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/index.html" @@ -7,6 +7,119 @@ Document + + + +
+
+ +
+

BookMark

+
+ + +
+ Logo +
+

BookMark B...

+

나만의 북마크

+
+ +
+ + +
+ Logo +
+

네이버

+

네이버 메인에서 다양한 경험을

+
+ +
+ + +
+ Logo +
+

Kakao

+

기술과 사람으로 더 나 세상을

+
+ +
+ + + + +
+
+ + + +
+

Study

+
+ + +
+ Logo +
+

Tailwind CSS

+

Tailwind CSS is a util

+
+ +
+ + +
+ Logo +
+

Next JS

+

Generated by create

+
+ +
+ + + + +
+ + \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" index 7b7a5c0..a530a51 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" @@ -7,56 +7,54 @@ -
+ + + + +
- logo - HANA + logo + Create account - - -
+ +
-

- Create account -

-
-
- +
- +
- +
- - -
-
- -
-
- -
-
- - - -

- Already have an account? Login here -

- + +
diff --git "a/\352\271\200\353\217\231\354\227\260/ex2.js" "b/\352\271\200\353\217\231\354\227\260/ex2.js" index 74612c2..eb25922 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex2.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex2.js" @@ -1,11 +1,9 @@ -// range 함수를 작성하세요. const range = (start, end, step = start > end ? -1 : 1) => { const result = []; if(step === 0 || start === end){ // start값과 end 값이 같다면 return [start]; } - if((start > end && step > 0) || (start < end && step < 0)){ return []; } @@ -20,21 +18,13 @@ const range = (start, end, step = start > end ? -1 : 1) => { else{ return [0]; } - } // 이 부분 코드 예쁘게 고치기 - - // if (end === undefined) { - // end = start; - // start = start > 0 ? 1 : 0; - // } // 개선책인데, 오류... - - + } // 소수점 연산을 위해 EPSILON값 추가 for(let i = start; (step > 0) ? i < end + (Number.EPSILON * 100) : i >= end - (Number.EPSILON * 100); i += step){ result.push(Math.round((i + Number.EPSILON) * 100) / 100); } return result; - }; module.exports = { range }; \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex3.js" "b/\352\271\200\353\217\231\354\227\260/ex3.js" index 39db32c..024fc66 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex3.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex3.js" @@ -8,5 +8,4 @@ Array.prototype.sortBy = function (sortProp = '') { } return 0; }); - }; diff --git "a/\352\271\200\353\217\231\354\227\260/ex5.js" "b/\352\271\200\353\217\231\354\227\260/ex5.js" index a9c805f..cbf7b1b 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex5.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex5.js" @@ -1,5 +1,5 @@ function convertInitialsToHangul(initials) { - // 초성 유니코드 문자와 초성 유니코드의 매핑 + // 초성 유니코드 문자 <-> 유니코드의 매핑 const initialMap = { 'ᄀ': 'ㄱ', 'ᄁ': 'ㄲ', 'ᄂ': 'ㄴ', 'ᄃ': 'ㄷ', 'ᄄ': 'ㄸ', 'ᄅ': 'ㄹ', 'ᄆ': 'ㅁ', 'ᄇ': 'ㅂ', 'ᄈ': 'ㅃ', 'ᄉ': 'ㅅ', @@ -25,9 +25,9 @@ function getInitials(arr) { // 초성만 파싱 return convertInitialsToHangul(initials); // 변환된 초성 문자를 한글 초성 문자로 반환 } -// 여러 문자열에서 초성 추출하는 함수 +// 초성 추출 함수 function extractInitials(data) { - return data.map(getInitials); // 각 문자열의 초성을 배열로 반환 + return data.map(getInitials); // 초성을 배열로 반환 } module.exports = { @@ -37,7 +37,7 @@ module.exports = { // 각 데이터의 초성을 추출하여 비교 const initialsData = extractInitials(data); // 데이터를 초성으로 변환한 배열 - // 입력받은 firstSounds로부터 정규표현식 생성 + // firstSounds로부터 정규표현식 생성 const pattern = firstSounds.split('').map(c => { if (/[ㄱ-ㅎ]/.test(c)) { return c; // 한글 초성일 경우 그대로 사용 From f7bab6b324af137b3b2828b68ec8236b58c3f1c3 Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Fri, 13 Sep 2024 15:10:10 +0900 Subject: [PATCH 09/11] result --- package.json | 18 -------- .../ex1/book-edit.html" | 2 +- .../ex1/index.html" | 2 +- .../ex1/register.html" | 2 +- .../ex10.test.ts" | 8 ++++ .../ex10.ts" | 30 ++++++++++++-- "\352\271\200\353\217\231\354\227\260/ex3.js" | 1 - .../ex3.test.js" | 1 - "\352\271\200\353\217\231\354\227\260/ex4.js" | 1 - "\352\271\200\353\217\231\354\227\260/ex5.js" | 4 +- .../ex6.test.ts" | 2 +- "\352\271\200\353\217\231\354\227\260/ex6.ts" | 39 ++++++++++++++++-- .../ex7.test.ts" | 11 ++--- "\352\271\200\353\217\231\354\227\260/ex7.ts" | 41 ++++++++++++++++++- "\352\271\200\353\217\231\354\227\260/ex8.ts" | 29 +++++++++++-- 15 files changed, 147 insertions(+), 44 deletions(-) delete mode 100644 package.json diff --git a/package.json b/package.json deleted file mode 100644 index 5c11e4a..0000000 --- a/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "febasic", - "version": "1.0.0", - "description": "하나로 4,5기 프론트엔드 기초 평가 과제", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [ - "JS", - "TS" - ], - "author": "indiflex", - "license": "ISC", - "devDependencies": { - "tailwindcss": "^3.4.11" - } -} diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" index 390af23..b054a94 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/book-edit.html" @@ -6,6 +6,7 @@ Bookmark Manager +
-

There is no marks.

diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/index.html" "b/\352\271\200\353\217\231\354\227\260/ex1/index.html" index 06a69c0..b5a2d69 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/index.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/index.html" @@ -4,7 +4,7 @@ - Document + MY BookMark diff --git "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" index a530a51..0a92718 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex1/register.html" +++ "b/\352\271\200\353\217\231\354\227\260/ex1/register.html" @@ -4,7 +4,7 @@ - + CREATE ACCOUNT diff --git "a/\352\271\200\353\217\231\354\227\260/ex10.test.ts" "b/\352\271\200\353\217\231\354\227\260/ex10.test.ts" index 6218a79..2f923bc 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex10.test.ts" +++ "b/\352\271\200\353\217\231\354\227\260/ex10.test.ts" @@ -2,3 +2,11 @@ import { ArrayList } from './ex10'; console.log('🚀 ArrayList:', ArrayList); // 여기에 테스트코드를 작성하세요. +const alist = new ArrayList([1, 2]); +// alist.add(3); +// alist.add(5,1); + +alist.set(1, 300); +alist.get(2); + + diff --git "a/\352\271\200\353\217\231\354\227\260/ex10.ts" "b/\352\271\200\353\217\231\354\227\260/ex10.ts" index 1ffaef5..2efd4cd 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex10.ts" +++ "b/\352\271\200\353\217\231\354\227\260/ex10.ts" @@ -61,11 +61,35 @@ class Collection { return this instanceof Queue; } } - class Stack extends Collection {} class Queue extends Collection {} + + + // ArrayList 클래스를 작성하세요. -class ArrayList extends Collection {} +class ArrayList extends Collection { + add(value: T, index?: number): void { + + } + + // 특정 인덱스에 value 대입 + set(index: number, value: T): void { + if (index >= this.length || index < 0) { + throw new Error("범위를 벗어났습니다."); + } + this._arr[index] = value; + } + + // 특정 인덱스 값 가져오기 + get(index: number): T { + if (index >= this.length || index < 0) { + throw new Error("범위를 벗어났습니다"); + } + return this._arr[index]; + } + +} + + -export { Stack, Queue, ArrayList }; diff --git "a/\352\271\200\353\217\231\354\227\260/ex3.js" "b/\352\271\200\353\217\231\354\227\260/ex3.js" index 024fc66..d96625a 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex3.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex3.js" @@ -1,6 +1,5 @@ Array.prototype.sortBy = function (sortProp = '') { const commands = sortProp.split(',').map(item => item.split(':')); - return this.slice().sort((a, b) => { for (const [key, order] of commands) { if (a[key] > b[key]) return order === 'desc' ? -1 : 1; diff --git "a/\352\271\200\353\217\231\354\227\260/ex3.test.js" "b/\352\271\200\353\217\231\354\227\260/ex3.test.js" index e11023c..1628e15 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex3.test.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex3.test.js" @@ -1,4 +1,3 @@ -// 수정된 테스트 코드 const assert = require('assert'); require('./ex3'); diff --git "a/\352\271\200\353\217\231\354\227\260/ex4.js" "b/\352\271\200\353\217\231\354\227\260/ex4.js" index f4160de..7da2d0d 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex4.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex4.js" @@ -66,6 +66,5 @@ function deepCopy(obj) { }); return copy; - } module.exports = { deepCopy }; \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex5.js" "b/\352\271\200\353\217\231\354\227\260/ex5.js" index cbf7b1b..77d6a2e 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex5.js" +++ "b/\352\271\200\353\217\231\354\227\260/ex5.js" @@ -34,10 +34,10 @@ module.exports = { searchByKoreanInitialSound: (data, firstSounds) => { let result = []; // 결과값 저장소 - // 각 데이터의 초성을 추출하여 비교 + // 데이터의 초성을 추출&비교 const initialsData = extractInitials(data); // 데이터를 초성으로 변환한 배열 - // firstSounds로부터 정규표현식 생성 + // 정규표현식 생성 const pattern = firstSounds.split('').map(c => { if (/[ㄱ-ㅎ]/.test(c)) { return c; // 한글 초성일 경우 그대로 사용 diff --git "a/\352\271\200\353\217\231\354\227\260/ex6.test.ts" "b/\352\271\200\353\217\231\354\227\260/ex6.test.ts" index 680c5e6..a6d9edb 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex6.test.ts" +++ "b/\352\271\200\353\217\231\354\227\260/ex6.test.ts" @@ -1,4 +1,4 @@ -import assert from 'assert'; +import * as assert from 'assert'; import { promiseAllSettled, randTime } from './ex6'; (async function testNormal() { diff --git "a/\352\271\200\353\217\231\354\227\260/ex6.ts" "b/\352\271\200\353\217\231\354\227\260/ex6.ts" index 424ca54..3b80957 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex6.ts" +++ "b/\352\271\200\353\217\231\354\227\260/ex6.ts" @@ -1,4 +1,37 @@ -export const randTime = (val: T): Promise => - new Promise(resolve => setTimeout(resolve, Math.random() * 1000, val)); +// 프로미스 상태 나타내는 타입 정의 +type SettledResult = + | { status: 'fulfilled'; value: T } // 성공 시 + | { status: 'rejected'; reason: any }; // 실패 시 -export function promiseAllSettled(promises: Promise[]) {} +// 랜덤시간 후 반환 +export const randTime = function (val: T): Promise { + return new Promise(function (resolve) { + setTimeout(function () { + resolve(val); // 반환 + }, Math.random() * 1000); // 랜덤 시간 후에 실행 + }); +}; + +// 성공/실패 상태를 반환하는 함수 +export function promiseAllSettled(promises: Promise[]): Promise[]> { + return new Promise(function (resolve) { + const results: SettledResult[] = new Array(promises.length); // 결과를 저장 배열 + let completed = 0; // 성공 promise 개수 + + promises.forEach(function (promise, index) { + promise + .then(function (value) { + results[index] = { status: 'fulfilled', value: value }; // 성공 시 결과 저장 + }) + .catch(function (reason) { + results[index] = { status: 'rejected', reason: reason }; // 실패 시 결과 저장 + }) + .finally(function () { + completed++; + if (completed === promises.length) { //모든 promise 완료 + resolve(results); + } + }); + }); + }); +} diff --git "a/\352\271\200\353\217\231\354\227\260/ex7.test.ts" "b/\352\271\200\353\217\231\354\227\260/ex7.test.ts" index 62b881d..e4f0933 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex7.test.ts" +++ "b/\352\271\200\353\217\231\354\227\260/ex7.test.ts" @@ -1,11 +1,13 @@ -import assert from 'assert'; +import * as assert from 'assert'; import { getPosts } from './ex7'; async function test(userId: string | number) { const posts = await getPosts(userId); - assert.strictEqual(posts?.length, 10); - assert.strictEqual(posts?.at(-1)?.comments?.length, 5); + // assert.strictEqual(posts?.length, 10); + // assert.strictEqual(posts?.at(-1)?.comments?.length, 5); + + assert.deepStrictEqual(posts[0], { postId: 1, title: @@ -61,8 +63,7 @@ async function test(userId: string | number) { 'harum architecto fugit inventore cupiditate\n' + 'voluptates magni quo et', }, - ], - }); + ],}); // 추가 테스트 코드를 작성하시오. } diff --git "a/\352\271\200\353\217\231\354\227\260/ex7.ts" "b/\352\271\200\353\217\231\354\227\260/ex7.ts" index 62812ac..c8e7001 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex7.ts" +++ "b/\352\271\200\353\217\231\354\227\260/ex7.ts" @@ -1,3 +1,40 @@ -const POST_URL = 'https://jsonplaceholder.typicode.com/posts'; +interface Post { + postId: number; + title: string; + comments: Comment[]; +} -export async function getPosts(userId: number | string) {} +interface Comment { + postId: number; + id: number; + email: string; + body: string; +} + +export async function getPosts(userId: number | string): Promise { + const postRes = await fetch(`https://jsonplaceholder.typicode.com/posts?userId=${userId}`); //비동기 패치 + const posts = await postRes.json(); + + const postsWithComments = await Promise.all( + posts.map(async (post: { id: number; title: string }) => { + const commentRes = await fetch(`https://jsonplaceholder.typicode.com/posts/${post.id}/comments`); //id에 알맞게 comments 데이터 fetch + const comments = await commentRes.json(); + + // comments 배열에서 불필요한 필드를 제거 + const filteredComments = comments.map((comment: any) => ({ + postId: comment.postId, + id: comment.id, + email: comment.email, + body: comment.body + })); + + return { + postId: post.id, + title: post.title, + comments: filteredComments + }; + }) + ); + + return postsWithComments; +} \ No newline at end of file diff --git "a/\352\271\200\353\217\231\354\227\260/ex8.ts" "b/\352\271\200\353\217\231\354\227\260/ex8.ts" index a67a2d2..26bc4ff 100644 --- "a/\352\271\200\353\217\231\354\227\260/ex8.ts" +++ "b/\352\271\200\353\217\231\354\227\260/ex8.ts" @@ -1,11 +1,32 @@ -// dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +function debounce(func: (arg: number) => void, delay: number) { //numbers와 delay값 매개변수 + let timeoutId: NodeJS.Timeout | null = null; //연속된 이벤트 중 마지막 이벤트만 실행 + return function (arg: number) { + if (timeoutId) { + clearTimeout(timeoutId); // 새로운 호출 발생 시 이전꺼 취소 + } + timeoutId = setTimeout(() => { + func(arg); // 전달될 함수를 인자로 호출 + }, delay); + }; +} + + +function throttle(func: (arg: number) => void, delay: number) { + let lastCall = 0; //throttle => 일정 시간 간격으로 발생 + return function (arg: number) { + const now = Date.now(); //밀리 초 단위 + if (now - lastCall >= delay) { //현재시간 - 마지막콜시간 >= delay + lastCall = now; + func(arg); + } + }; +} + -// function throttle... const debo = debounce((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) debo(i); // 15 출력 const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 + From 048dcd8984163068bab4aa5a6089f6e183850fe0 Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Fri, 13 Sep 2024 15:12:08 +0900 Subject: [PATCH 10/11] result_ver1.1 --- tsconfig.json | 110 -------------------------------------------------- 1 file changed, 110 deletions(-) delete mode 100644 tsconfig.json diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 3593f49..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - "lib": [ - "ESNext" - ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} From e4f26ee1dd2feb22316017b06bcd6128813c6077 Mon Sep 17 00:00:00 2001 From: commaengddongyeon Date: Fri, 13 Sep 2024 15:25:08 +0900 Subject: [PATCH 11/11] 0325 --- "\352\271\200\353\217\231\354\227\260/ex6.js" | 35 + .../ex6.test.js" | 84 + "\352\271\200\353\217\231\354\227\260/ex7.js" | 82 + .../ex7.test.js" | 107 + "\352\271\200\353\217\231\354\227\260/ex8.js" | 32 + .../package-lock.json" | 2029 +++++++++++++++++ .../package.json" | 22 + .../tsconfig.json" | 110 + 8 files changed, 2501 insertions(+) create mode 100644 "\352\271\200\353\217\231\354\227\260/ex6.js" create mode 100644 "\352\271\200\353\217\231\354\227\260/ex6.test.js" create mode 100644 "\352\271\200\353\217\231\354\227\260/ex7.js" create mode 100644 "\352\271\200\353\217\231\354\227\260/ex7.test.js" create mode 100644 "\352\271\200\353\217\231\354\227\260/ex8.js" create mode 100644 "\352\271\200\353\217\231\354\227\260/package-lock.json" create mode 100644 "\352\271\200\353\217\231\354\227\260/package.json" create mode 100644 "\352\271\200\353\217\231\354\227\260/tsconfig.json" diff --git "a/\352\271\200\353\217\231\354\227\260/ex6.js" "b/\352\271\200\353\217\231\354\227\260/ex6.js" new file mode 100644 index 0000000..acfc1ca --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/ex6.js" @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.randTime = void 0; +exports.promiseAllSettled = promiseAllSettled; +// 랜덤시간 후 반환 +var randTime = function (val) { + return new Promise(function (resolve) { + setTimeout(function () { + resolve(val); // 반환 + }, Math.random() * 1000); // 랜덤 시간 후에 실행 + }); +}; +exports.randTime = randTime; +// 성공/실패 상태를 반환하는 함수 +function promiseAllSettled(promises) { + return new Promise(function (resolve) { + var results = new Array(promises.length); // 결과를 저장 배열 + var completed = 0; // 성공 promise 개수 + promises.forEach(function (promise, index) { + promise + .then(function (value) { + results[index] = { status: 'fulfilled', value: value }; // 성공 시 결과 저장 + }) + .catch(function (reason) { + results[index] = { status: 'rejected', reason: reason }; // 실패 시 결과 저장 + }) + .finally(function () { + completed++; + if (completed === promises.length) { //모든 promise 완료 + resolve(results); + } + }); + }); + }); +} diff --git "a/\352\271\200\353\217\231\354\227\260/ex6.test.js" "b/\352\271\200\353\217\231\354\227\260/ex6.test.js" new file mode 100644 index 0000000..ffa51f9 --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/ex6.test.js" @@ -0,0 +1,84 @@ +"use strict"; +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 = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["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 (g && (g = 0, op[0] && (_ = 0)), _) 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 }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert = require("assert"); +var ex6_1 = require("./ex6"); +(function testNormal() { + return __awaiter(this, void 0, void 0, function () { + var _a, _b, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + _b = (_a = assert).deepStrictEqual; + return [4 /*yield*/, (0, ex6_1.promiseAllSettled)([(0, ex6_1.randTime)(1), (0, ex6_1.randTime)(2), (0, ex6_1.randTime)(3)])]; + case 1: + _c = [_d.sent()]; + return [4 /*yield*/, Promise.allSettled([(0, ex6_1.randTime)(1), (0, ex6_1.randTime)(2), (0, ex6_1.randTime)(3)])]; + case 2: + _b.apply(_a, _c.concat([_d.sent()])); + return [2 /*return*/]; + } + }); + }); +})(); +(function testWithReject() { + return __awaiter(this, void 0, void 0, function () { + var _a, _b, _c; + return __generator(this, function (_d) { + switch (_d.label) { + case 0: + _b = (_a = assert).deepStrictEqual; + return [4 /*yield*/, (0, ex6_1.promiseAllSettled)([ + (0, ex6_1.randTime)(11), + Promise.reject('REJECT'), + (0, ex6_1.randTime)(33), + ])]; + case 1: + _c = [_d.sent()]; + return [4 /*yield*/, Promise.allSettled([ + (0, ex6_1.randTime)(11), + Promise.reject('REJECT'), + (0, ex6_1.randTime)(33), + ])]; + case 2: + _b.apply(_a, _c.concat([_d.sent()])); + return [2 /*return*/]; + } + }); + }); +})(); diff --git "a/\352\271\200\353\217\231\354\227\260/ex7.js" "b/\352\271\200\353\217\231\354\227\260/ex7.js" new file mode 100644 index 0000000..942342b --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/ex7.js" @@ -0,0 +1,82 @@ +"use strict"; +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 = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["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 (g && (g = 0, op[0] && (_ = 0)), _) 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 }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPosts = getPosts; +function getPosts(userId) { + return __awaiter(this, void 0, void 0, function () { + var postRes, posts, postsWithComments; + var _this = this; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, fetch("https://jsonplaceholder.typicode.com/posts?userId=".concat(userId))]; + case 1: + postRes = _a.sent(); + return [4 /*yield*/, postRes.json()]; + case 2: + posts = _a.sent(); + return [4 /*yield*/, Promise.all(posts.map(function (post) { return __awaiter(_this, void 0, void 0, function () { + var commentRes, comments, filteredComments; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, fetch("https://jsonplaceholder.typicode.com/posts/".concat(post.id, "/comments"))]; + case 1: + commentRes = _a.sent(); + return [4 /*yield*/, commentRes.json()]; + case 2: + comments = _a.sent(); + filteredComments = comments.map(function (comment) { return ({ + postId: comment.postId, + id: comment.id, + email: comment.email, + body: comment.body + }); }); + return [2 /*return*/, { + postId: post.id, + title: post.title, + comments: filteredComments + }]; + } + }); + }); }))]; + case 3: + postsWithComments = _a.sent(); + return [2 /*return*/, postsWithComments]; + } + }); + }); +} diff --git "a/\352\271\200\353\217\231\354\227\260/ex7.test.js" "b/\352\271\200\353\217\231\354\227\260/ex7.test.js" new file mode 100644 index 0000000..60bc805 --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/ex7.test.js" @@ -0,0 +1,107 @@ +"use strict"; +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 = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["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 (g && (g = 0, op[0] && (_ = 0)), _) 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 }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var assert = require("assert"); +var ex7_1 = require("./ex7"); +function test(userId) { + return __awaiter(this, void 0, void 0, function () { + var posts; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (0, ex7_1.getPosts)(userId)]; + case 1: + posts = _a.sent(); + // assert.strictEqual(posts?.length, 10); + // assert.strictEqual(posts?.at(-1)?.comments?.length, 5); + assert.deepStrictEqual(posts[0], { + postId: 1, + title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', + comments: [ + { + postId: 1, + id: 1, + email: 'Eliseo@gardner.biz', + body: 'laudantium enim quasi est quidem magnam voluptate ipsam eos\n' + + 'tempora quo necessitatibus\n' + + 'dolor quam autem quasi\n' + + 'reiciendis et nam sapiente accusantium', + }, + { + postId: 1, + id: 2, + email: 'Jayne_Kuhic@sydney.com', + body: 'est natus enim nihil est dolore omnis voluptatem numquam\n' + + 'et omnis occaecati quod ullam at\n' + + 'voluptatem error expedita pariatur\n' + + 'nihil sint nostrum voluptatem reiciendis et', + }, + { + postId: 1, + id: 3, + email: 'Nikita@garfield.biz', + body: 'quia molestiae reprehenderit quasi aspernatur\n' + + 'aut expedita occaecati aliquam eveniet laudantium\n' + + 'omnis quibusdam delectus saepe quia accusamus maiores nam est\n' + + 'cum et ducimus et vero voluptates excepturi deleniti ratione', + }, + { + postId: 1, + id: 4, + email: 'Lew@alysha.tv', + body: 'non et atque\n' + + 'occaecati deserunt quas accusantium unde odit nobis qui voluptatem\n' + + 'quia voluptas consequuntur itaque dolor\n' + + 'et qui rerum deleniti ut occaecati', + }, + { + postId: 1, + id: 5, + email: 'Hayden@althea.biz', + body: 'harum non quasi et ratione\n' + + 'tempore iure ex voluptates in ratione\n' + + 'harum architecto fugit inventore cupiditate\n' + + 'voluptates magni quo et', + }, + ], + }); + return [2 /*return*/]; + } + }); + }); +} +test(1); diff --git "a/\352\271\200\353\217\231\354\227\260/ex8.js" "b/\352\271\200\353\217\231\354\227\260/ex8.js" new file mode 100644 index 0000000..5bdabd2 --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/ex8.js" @@ -0,0 +1,32 @@ +// dummy(mock)입니다. 올바르게 수정하세요. +// const debounce = (cb: any, delay: number) => (i: number) => {}; +// const throttle = (cb: any, delay: number) => (i: number) => {}; +// function throttle... +var debo = debounce(function (a) { return console.log(a + 1); }, 500); +for (var i = 10; i < 15; i++) + debo(i); // 15 출력 +var thro = throttle(function (a) { return console.log(a + 1); }, 500); +for (var i = 10; i < 15; i++) + thro(i); // 11 출력 +function debounce(func, delay) { + var timeoutId = null; + return function (arg) { + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(function () { + func(arg); + }, delay); + }; +} + +function throttle(func, delay) { + var lastCall = 0; + return function (arg) { + var now = Date.now(); + if (now - lastCall >= delay) { + lastCall = now; + func(arg); + } + }; +} diff --git "a/\352\271\200\353\217\231\354\227\260/package-lock.json" "b/\352\271\200\353\217\231\354\227\260/package-lock.json" new file mode 100644 index 0000000..5bc3f34 --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/package-lock.json" @@ -0,0 +1,2029 @@ +{ + "name": "febasic", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "febasic", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@types/node": "^22.5.4", + "tailwindcss": "^3.4.11", + "tsx": "^4.19.1", + "typescript": "^5.6.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/node": { + "version": "22.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", + "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/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, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.45", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", + "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.11.tgz", + "integrity": "sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/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, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git "a/\352\271\200\353\217\231\354\227\260/package.json" "b/\352\271\200\353\217\231\354\227\260/package.json" new file mode 100644 index 0000000..69fc362 --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/package.json" @@ -0,0 +1,22 @@ +{ + "name": "febasic", + "version": "1.0.0", + "description": "하나로 4,5기 프론트엔드 기초 평가 과제", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "JS", + "TS" + ], + "author": "indiflex", + "license": "ISC", + "devDependencies": { + "@types/node": "^22.5.4", + "tailwindcss": "^3.4.11", + "tsx": "^4.19.1", + "typescript": "^5.6.2", + "assert": "2.1.0" + } +} diff --git "a/\352\271\200\353\217\231\354\227\260/tsconfig.json" "b/\352\271\200\353\217\231\354\227\260/tsconfig.json" new file mode 100644 index 0000000..4916c47 --- /dev/null +++ "b/\352\271\200\353\217\231\354\227\260/tsconfig.json" @@ -0,0 +1,110 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": [ + "ESNext" + ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} \ No newline at end of file