diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..34afba9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1522 @@ +{ + "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" + } + }, + "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/@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/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/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/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/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/package.json b/package.json index c356ea8..220b34a 100644 --- a/package.json +++ b/package.json @@ -11,5 +11,9 @@ "TS" ], "author": "indiflex", - "license": "ISC" + "license": "ISC", + "devDependencies": { + "@types/node": "^22.5.4", + "tailwindcss": "^3.4.11" + } } diff --git "a/\352\271\200\352\260\200\354\227\260/ex8.ts" "b/\352\271\200\352\260\200\354\227\260/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\352\271\200\352\260\200\354\227\260/ex8.ts" +++ "b/\352\271\200\352\260\200\354\227\260/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 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..aadb446 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,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\352\271\200\353\217\231\354\235\200/ex7.ts" "b/\352\271\200\353\217\231\354\235\200/ex7.ts" index 62812ac..e69de29 100644 --- "a/\352\271\200\353\217\231\354\235\200/ex7.ts" +++ "b/\352\271\200\353\217\231\354\235\200/ex7.ts" @@ -1,3 +0,0 @@ -const POST_URL = 'https://jsonplaceholder.typicode.com/posts'; - -export async function getPosts(userId: number | string) {} diff --git "a/\352\271\200\353\217\231\354\235\200/ex8.ts" "b/\352\271\200\353\217\231\354\235\200/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\352\271\200\353\217\231\354\235\200/ex8.ts" +++ "b/\352\271\200\353\217\231\354\235\200/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\352\271\200\353\257\270\352\260\225/ex1/book-edit.html" "b/\352\271\200\353\257\270\352\260\225/ex1/book-edit.html" index e69de29..37fca07 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex1/book-edit.html" +++ "b/\352\271\200\353\257\270\352\260\225/ex1/book-edit.html" @@ -0,0 +1,122 @@ + + + + + + Bookmark Edit + + + + + + +
+

+ BookMark Logo + + BookMark +

+ +
+ + +
+ +
+
+
+ +
+
+ + +
+ + +
+ +
+ Undo Icon +
+ +
+ Save Icon +
+
+ +
+

There is no marks.

+
+
+
+ + +
+ + +
+
+ + + + diff --git "a/\352\271\200\353\257\270\352\260\225/ex1/index.html" "b/\352\271\200\353\257\270\352\260\225/ex1/index.html" index e69de29..7523e59 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex1/index.html" +++ "b/\352\271\200\353\257\270\352\260\225/ex1/index.html" @@ -0,0 +1,353 @@ + + + + + + Home Page + + + + + +
+
+

+ BookMark Logo + + BookMark +

+
+ +
+
+
+
+ +
+

+ BookMark BookMark BookMark BookMark BookMark +

+ + +
+
+ Icon +
+
+
+

+ 55BookMark Bookmark BookMark BookMark BookMark BookMark +

+
+ + +
+ settings-icon + +
+
+ +

+ 55만의 북마크만의 스타일 +

+
+
+
+ +
+
+ Naver +
+
+
+

+ 네이버 +

+
+ + +
+ settings-icon + +
+
+ +

+ 네이버 메인에서 다양한 정보 +

+
+
+
+ +
+
+ kakao +
+
+
+

+ KAKAO +

+
+ + +
+ settings-icon + +
+
+ +

+ 더 나은 세상을 만드는 카카오 서비스 +

+
+
+
+
+
+ Youtube_logo +
+
+
+

+ Youtube +

+
+ + +
+ settings-icon + +
+
+ +

+ 친구, 가족을 비롯해 전 세계 사람들과 동영상 공유. +

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

+ Study +

+ + +
+
+ Tailwind CSS +
+
+
+

+ Tailwind CSS +

+
+ + +
+ settings-icon + +
+
+ +

+ Tailwind CSS is a utility-first CSS framework for rapidly + building modern websites without ever leaving your HTML. +

+
+
+
+ + +
+
+ Next.js +
+
+
+

+ Create Next App +

+
+ + +
+ settings-icon + +
+
+ +

+ Next.js enables you to create high-quality web applications + with the power of React components. +

+
+
+
+ +
+ + +
+
+
+
+
+ + + diff --git "a/\352\271\200\353\257\270\352\260\225/ex1/input.css" "b/\352\271\200\353\257\270\352\260\225/ex1/input.css" new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ "b/\352\271\200\353\257\270\352\260\225/ex1/input.css" @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git "a/\352\271\200\353\257\270\352\260\225/ex1/output.css" "b/\352\271\200\353\257\270\352\260\225/ex1/output.css" new file mode 100644 index 0000000..e69de29 diff --git "a/\352\271\200\353\257\270\352\260\225/ex1/register.html" "b/\352\271\200\353\257\270\352\260\225/ex1/register.html" index e69de29..2613002 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex1/register.html" +++ "b/\352\271\200\353\257\270\352\260\225/ex1/register.html" @@ -0,0 +1,118 @@ + + + + + + Register + + + + +
+

+ BookMark Logo + + BookMark +

+ +
+ + +
+
+
+
+

+ Sign Up +

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+ + + diff --git "a/\352\271\200\353\257\270\352\260\225/ex1/tailwind.config.js" "b/\352\271\200\353\257\270\352\260\225/ex1/tailwind.config.js" new file mode 100644 index 0000000..784a5fa --- /dev/null +++ "b/\352\271\200\353\257\270\352\260\225/ex1/tailwind.config.js" @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./ex1/**/*.{html,js}"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git "a/\352\271\200\353\257\270\352\260\225/ex10.test.ts" "b/\352\271\200\353\257\270\352\260\225/ex10.test.ts" index 6218a79..8b5ceeb 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex10.test.ts" +++ "b/\352\271\200\353\257\270\352\260\225/ex10.test.ts" @@ -1,4 +1,83 @@ -import { ArrayList } from './ex10'; -console.log('🚀 ArrayList:', ArrayList); +import { ArrayList } from "./ex10"; +console.log("🚀 ArrayList:", ArrayList); -// 여기에 테스트코드를 작성하세요. +const assert = require("assert"); + +function runTests() { + // Test listToArray + assert.deepStrictEqual( + ArrayList.listToArray({ value: 1, rest: { value: 2, rest: null } }), + [1, 2] + ); + + // Test arrayToList + assert.deepStrictEqual(ArrayList.arrayToList([1, 2]), { + value: 1, + rest: { value: 2, rest: null }, + }); + + // Test ArrayList functionality + const alist = new ArrayList([1, 2]); + + assert.deepStrictEqual( + alist.toString(), + 'ArrayList(2) {"value":1,"rest":{"value":2,"rest":null}}' + ); + + alist.add(3); + assert.deepStrictEqual( + alist.toString(), + 'ArrayList(3) {"value":1,"rest":{"value":2,"rest":{"value":3,"rest":null}}}' + ); + + alist.add(5, 1); + assert.deepStrictEqual( + alist.toString(), + 'ArrayList(4) {"value":1,"rest":{"value":5,"rest":{"value":2,"rest":{"value":3,"rest":null}}}}' + ); + + alist.remove(2); + assert.deepStrictEqual( + alist.toString(), + 'ArrayList(3) {"value":1,"rest":{"value":5,"rest":{"value":3,"rest":null}}}' + ); + + alist.add(22, 1); + assert.deepStrictEqual( + alist.toString(), + 'ArrayList(4) {"value":1,"rest":{"value":22,"rest":{"value":5,"rest":{"value":3,"rest":null}}}}' + ); + + alist.add(33, 1); + assert.deepStrictEqual( + alist.toString(), + 'ArrayList(5) {"value":1,"rest":{"value":33,"rest":{"value":22,"rest":{"value":5,"rest":{"value":3,"rest":null}}}}}' + ); + + alist.set(1, 300); + assert.deepStrictEqual( + alist.toString(), + 'ArrayList(5) {"value":1,"rest":{"value":300,"rest":{"value":22,"rest":{"value":5,"rest":{"value":3,"rest":null}}}}}' + ); + + assert.strictEqual(alist.get(2), 22); + assert.strictEqual(alist.listSize, 5); + + assert.strictEqual(alist.indexOf(300), 1); + assert.strictEqual(alist.contains(300), true); + assert.strictEqual(alist.contains(301), false); + + assert.strictEqual(alist.isEmpty, false); + assert.strictEqual(alist.peek, 3); + + assert.deepStrictEqual(alist.toArray(), [1, 300, 22, 5, 3]); + + const iterator = alist.iterator(); + assert.deepStrictEqual(iterator.next(), { value: 1, done: false }); + + alist.clear(); + assert.strictEqual(alist.isEmpty, true); + console.log("all test passed"); +} + +runTests(); diff --git "a/\352\271\200\353\257\270\352\260\225/ex10.ts" "b/\352\271\200\353\257\270\352\260\225/ex10.ts" index 1ffaef5..19a603d 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex10.ts" +++ "b/\352\271\200\353\257\270\352\260\225/ex10.ts" @@ -1,71 +1,222 @@ class Collection { - private readonly arr = Array(); + protected size: number = 0; - constructor(...args: T[]) { - this.arr.push(...args); + // Convert the structure to an array + toArray(): T[] { + return []; } - get _arr() { - return this.arr; + // Other basic collection methods, like size or clear, can be extended + getSize(): number { + return this.size; } - push(...args: T[]) { - this.arr.push(...args); - return this.arr; + clear() { + this.size = 0; } - get peek(): T | undefined { - return this.isQueue() ? this.arr[0] : this.arr.at(-1); + toString() { + return `<${this.constructor.name}: [${this.toArray()}]>`; } +} + +interface ListNode { + value: T; + rest: ListNode | null; +} - get poll(): T | undefined { - return this.isQueue() ? this.arr.shift() : this.arr.pop(); +class ArrayList extends Collection { + private head: ListNode | null = null; + + constructor(values: T[] = []) { + super(); + this.size = values.length; + this.head = ArrayList.arrayToList(values); } - remove() { - return this.poll; + // Static method to convert a linked list to an array + static listToArray(node: ListNode | null): T[] { + const result: T[] = []; + while (node) { + result.push(node.value); + node = node.rest; + } + return result; } - get length() { - return this.arr.length; + // Static method to convert an array to a linked list + static arrayToList(arr: T[]): ListNode | null { + if (arr.length === 0) return null; + const [first, ...rest] = arr; + return { value: first, rest: ArrayList.arrayToList(rest) }; } - get isEmpty() { - return !this.arr.length; + // Overloading signatures + add(value: T): void; + add(value: T, index: number): void; + + // Implementation + add(value: T, index?: number): void { + if (index === undefined) { + // Add value at the end of the list + this.addAt(this.head, value, this.size); + } else { + // Add value at a specified index + if (index < 0 || index > this.size) { + throw new RangeError("Index out of bounds"); + } + this.head = this.addAt(this.head, value, index); + } + this.size++; } - clear() { - this.arr.length = 0; + private addAt( + node: ListNode | null, + value: T, + index: number + ): ListNode { + if (index === 0) return { value, rest: node }; + if (!node) throw new Error("Invalid state"); + node.rest = this.addAt(node.rest, value, index - 1); + return node; } - iterator() { - return this[Symbol.iterator](); + // Remove the first occurrence of a value + remove(value: T): void { + let current: ListNode | null = this.head; + let previous: ListNode | null = null; + + while (current) { + if (current.value === value) { + if (previous) { + previous.rest = current.rest; + } else { + this.head = current.rest; + } + this.size--; + return; + } + previous = current; + current = current.rest; + } } - // [1, 2, 3] - *[Symbol.iterator]() { - for (let i = this.length - 1; i >= 0; i -= 1) { - yield this.toArray()[i]; + // Remove a value at a specified index + removeByIndex(index: number): void { + if (index < 0 || index >= this.size) + throw new RangeError("Index out of bounds"); + + this.head = this.removeAt(this.head, index); + this.size--; + } + + private removeAt( + node: ListNode | null, + index: number + ): ListNode | null { + if (index === 0 && node) return node.rest; + if (!node) throw new Error("Invalid state"); + node.rest = this.removeAt(node.rest, index - 1); + return node; + } + + // Set a value at a specific index + set(index: number, value: T): void { + if (index < 0 || index >= this.size) + throw new RangeError("Index out of bounds"); + + let node = this.head; + for (let i = 0; i < index; i++) { + node = node?.rest ?? null; + } + if (node) { + node.value = value; } } - toArray() { - return this.isQueue() ? this.arr.toReversed() : this.arr; + // Get a value at a specific index + get(index: number): T | undefined { + if (index < 0 || index >= this.size) + throw new RangeError("Index out of bounds"); + + let node = this.head; + for (let i = 0; i < index; i++) { + node = node?.rest ?? null; + } + return node?.value; } - print() { - console.log(`<${this.constructor.name}: [${this.toArray()}]>`); + // Check if a value is contained in the list + contains(value: T): boolean { + let node = this.head; + while (node) { + if (node.value === value) return true; + node = node.rest; + } + return false; } - private isQueue() { - return this instanceof Queue; + // Convert to array + toArray(): T[] { + return ArrayList.listToArray(this.head); + } + + // Find index of a specific value + indexOf(value: T): number { + let node = this.head; + let index = 0; + while (node) { + if (node.value === value) return index; + node = node.rest; + index++; + } + return -1; + } + // Getter를 추가하여 size에 접근 가능하도록 + get listSize(): number { + return this.size; + } + + // Peek at the last value + get peek(): T | undefined { + return this.get(this.size - 1); } -} -class Stack extends Collection {} -class Queue extends Collection {} + // Check if the list is empty + get isEmpty(): boolean { + return this.size === 0; + } + + // Clear the list + clear(): void { + this.head = null; + this.size = 0; + } + + // Print the list + print(): void { + console.log(this.toString()); + } -// ArrayList 클래스를 작성하세요. -class ArrayList extends Collection {} + // Iterator + iterator(): Iterator { + let node = this.head; + return { + next(): IteratorResult { + if (node) { + const value = node.value; + node = node.rest; + return { value, done: false }; + } else { + return { value: undefined as any, done: true }; + } + }, + }; + } + + toString() { + return `ArrayList(${this.size}) ${JSON.stringify(this.head)}`; + } +} -export { Stack, Queue, ArrayList }; +export { ArrayList }; diff --git "a/\352\271\200\353\257\270\352\260\225/ex2.js" "b/\352\271\200\353\257\270\352\260\225/ex2.js" index 6b95f04..b951934 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex2.js" +++ "b/\352\271\200\353\257\270\352\260\225/ex2.js" @@ -1,4 +1,40 @@ -// range 함수를 작성하세요. -const range = (start, end, step = start > end ? -1 : 1) => { }; +const range = (start, end, step = start > end ? -1 : 1) => { + let result = []; + + // 소수 처리용 함수 + const addWithPrecision = (a, b) => { + return parseFloat((a + b).toFixed(10)); // 소수점 10자리까지 처리 + }; + + // end가 정의되지 않은 경우 처리 + if (end === undefined) { + if (start === 0) return [0]; + if (start > 0) { + end = start; + start = 1; + } else { + end = -1; + } + } + + // step이 0일 경우 단일 요소 배열 반환 + if (step === 0) return [start]; + + // 범위와 step 방향이 일치하지 않을 때 빈 배열 반환 + if ((start > end && step > 0) || (start < end && step < 0)) { + return result; + } + + // 일반적인 경우에 대한 루프 (소수 포함) + for ( + let i = start; + step > 0 ? i <= end : i >= end; + i = addWithPrecision(i, step) + ) { + result.push(i); + } + + return result; +}; module.exports = { range }; diff --git "a/\352\271\200\353\257\270\352\260\225/ex3.js" "b/\352\271\200\353\257\270\352\260\225/ex3.js" index b1b0d75..1a87837 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex3.js" +++ "b/\352\271\200\353\257\270\352\260\225/ex3.js" @@ -1,3 +1,16 @@ -Array.prototype.sortBy = function (sortProp = '') { - return this; +Array.prototype.sortBy = function (obj = "") { + const sortObj = obj.split(",").map((elem) => { + const [key, order = "asc"] = elem.split(":"); + return { key, order }; + }); + + return this.sort((a, b) => { + for (const { key, order } of sortObj) { + const comp = a[key] < b[key] ? -1 : a[key] > b[key] ? 1 : 0; + if (comp !== 0) { + return order === "asc" ? comp : -comp; + } + } + return 0; + }); }; diff --git "a/\352\271\200\353\257\270\352\260\225/ex3.test.js" "b/\352\271\200\353\257\270\352\260\225/ex3.test.js" index 6c27a4d..2774d71 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex3.test.js" +++ "b/\352\271\200\353\257\270\352\260\225/ex3.test.js" @@ -1,18 +1,18 @@ -const assert = require('assert'); -require('./ex3'); +const assert = require("assert"); +require("./ex3"); -const hong = { id: 1, name: 'Hong', city: 'Busan', dept: 1 }; -const kim = { id: 2, name: 'Kim', city: 'Seoul', dept: 2 }; -const lee = { id: 3, name: 'Lee', city: 'Daegu', dept: 2 }; +const hong = { id: 1, name: "Hong", city: "Busan", dept: 1 }; +const kim = { id: 2, name: "Kim", city: "Seoul", dept: 2 }; +const lee = { id: 3, name: "Lee", city: "Daegu", dept: 2 }; 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:desc'), [kim, lee, hong]); -assert.deepStrictEqual(users.sortBy('name:desc,id:,dept:desc'), [ - 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"), [lee, kim, hong]); +assert.deepStrictEqual(users.sortBy("dept:desc,city:desc"), [kim, lee, hong]); +assert.deepStrictEqual(users.sortBy("name:desc,id:,dept:desc"), [ 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\257\270\352\260\225/ex4.js" "b/\352\271\200\353\257\270\352\260\225/ex4.js" index 9ede02f..d1a2c64 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex4.js" +++ "b/\352\271\200\353\257\270\352\260\225/ex4.js" @@ -1,3 +1,47 @@ -function deepCopy(obj) {} +function deepCopy(obj, ref = new WeakMap()) { + // 기본 타입 (null, undefined, number, string, boolean 등) 처리 + if (obj === null || typeof obj !== "object") return obj; + + // 순환 참조 처리 + if (ref.has(obj)) return ref.get(obj); + + // 새로운 객체 생성 + let copy; + if (Array.isArray(obj)) { + //배열 + copy = []; + obj.forEach((item, index) => { + copy[index] = deepCopy(item, ref); + }); + } else if (obj instanceof Set) { + //Set + copy = new Set(); + obj.forEach((value) => { + copy.add(deepCopy(value, ref)); + }); + } else if (obj instanceof Map) { + //Map + copy = new Map(); + obj.forEach((value, key) => { + copy.set(deepCopy(key, ref), deepCopy(value, ref)); + }); + } else if (obj instanceof WeakSet || obj instanceof WeakMap) { + // WeakSet과 WeakMap + return obj; + } else { + // 일반 객체 (함수 포함) + copy = Object.create(Object.getPrototypeOf(obj)); + Object.getOwnPropertyNames(obj).forEach((key) => { + copy[key] = deepCopy(obj[key], ref); + }); + Object.getOwnPropertySymbols(obj).forEach((sym) => { + copy[sym] = deepCopy(obj[sym], ref); + }); + } + + // 순환 참조 처리 + ref.set(obj, copy); + return copy; +} module.exports = { deepCopy }; diff --git "a/\352\271\200\353\257\270\352\260\225/ex5.js" "b/\352\271\200\353\257\270\352\260\225/ex5.js" index 464a05a..3d61249 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex5.js" +++ "b/\352\271\200\353\257\270\352\260\225/ex5.js" @@ -1,3 +1,46 @@ module.exports = { - searchByKoreanInitialSound: (data, firstSounds) => {}, + searchByKoreanInitialSound: (data, firstSounds) => { + const CHOSUNG_LIST = [ + "ㄱ", + "ㄲ", + "ㄴ", + "ㄷ", + "ㄸ", + "ㄹ", + "ㅁ", + "ㅂ", + "ㅃ", + "ㅅ", + "ㅆ", + "ㅇ", + "ㅈ", + "ㅉ", + "ㅊ", + "ㅋ", + "ㅌ", + "ㅍ", + "ㅎ", + ]; + + // 초성 가져오기 + const getChosung = (char) => { + const code = char.charCodeAt(0) - 0xac00; + return code >= 0 && code < 11172 + ? CHOSUNG_LIST[Math.floor(code / 588)] + : char; // 한글이 아니면 그대로 반환 + }; + + // 정규식 패턴 생성 + const regex = new RegExp( + firstSounds + .split("") + .map((char) => (/[ㄱ-ㅎ]/.test(char) ? char : `(${char})`)) // 초성은 그대로, 비초성은 괄호 + .join(".*?") + ); + + return data.filter((item) => { + const strChosung = item.split("").map(getChosung).join(""); + return regex.test(strChosung); + }); + }, }; diff --git "a/\352\271\200\353\257\270\352\260\225/ex6.test.ts" "b/\352\271\200\353\257\270\352\260\225/ex6.test.ts" index 680c5e6..2385f9c 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex6.test.ts" +++ "b/\352\271\200\353\257\270\352\260\225/ex6.test.ts" @@ -1,5 +1,5 @@ -import assert from 'assert'; -import { promiseAllSettled, randTime } from './ex6'; +import assert from "assert"; +import { promiseAllSettled, randTime } from "./ex6"; (async function testNormal() { assert.deepStrictEqual( @@ -12,12 +12,12 @@ import { promiseAllSettled, randTime } from './ex6'; assert.deepStrictEqual( await promiseAllSettled([ randTime(11), - Promise.reject('REJECT'), + Promise.reject("REJECT"), randTime(33), ]), await Promise.allSettled([ randTime(11), - Promise.reject('REJECT'), + Promise.reject("REJECT"), randTime(33), ]) ); diff --git "a/\352\271\200\353\257\270\352\260\225/ex6.ts" "b/\352\271\200\353\257\270\352\260\225/ex6.ts" index 424ca54..3bbb0b6 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex6.ts" +++ "b/\352\271\200\353\257\270\352\260\225/ex6.ts" @@ -1,4 +1,27 @@ export const randTime = (val: T): Promise => - new Promise(resolve => setTimeout(resolve, Math.random() * 1000, val)); + new Promise((resolve) => setTimeout(resolve, Math.random() * 1000, val)); -export function promiseAllSettled(promises: Promise[]) {} +export function promiseAllSettled( + promises: Promise[] +): Promise[]> { + return new Promise((resolve) => { + const results: PromiseSettledResult[] = []; + let endCount = 0; + + promises.forEach((promise, index) => { + promise + .then((value) => { + results[index] = { status: "fulfilled", value }; + }) + .catch((reason) => { + results[index] = { status: "rejected", reason }; + }) + .finally(() => { + endCount++; + if (endCount === promises.length) { + resolve(results); + } + }); + }); + }); +} diff --git "a/\352\271\200\353\257\270\352\260\225/ex7.test.ts" "b/\352\271\200\353\257\270\352\260\225/ex7.test.ts" index 62b881d..fc05bb5 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex7.test.ts" +++ "b/\352\271\200\353\257\270\352\260\225/ex7.test.ts" @@ -1,70 +1,101 @@ -import assert from 'assert'; -import { getPosts } from './ex7'; +import 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); + // 기본 테스트: posts의 길이와 마지막 posts의 댓글 수 + assert.strictEqual(posts?.length, 10, "Expected 10 posts"); + assert.strictEqual( + posts?.at(-1)?.comments?.length, + 5, + "Expected last post to have 5 comments" + ); + + // 첫 번째 포스트가 예상과 일치하는지 검사 assert.deepStrictEqual(posts[0], { postId: 1, title: - 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', + "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", comments: [ { postId: 1, id: 1, - email: 'Eliseo@gardner.biz', + 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', + "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', + 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', + "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', + 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', + "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', + 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', + "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', + 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', + "harum non quasi et ratione\n" + + "tempore iure ex voluptates in ratione\n" + + "harum architecto fugit inventore cupiditate\n" + + "voluptates magni quo et", }, ], }); - // 추가 테스트 코드를 작성하시오. + // 추가 테스트: 게시물이 비어있는 경우 + const emptyPosts = await getPosts(99999); // 존재하지 않는 userId + assert.strictEqual( + emptyPosts.length, + 0, + "Expected no posts for a non-existing user" + ); + + // 각 게시물에 적어도 하나의 댓글이 있는지 검사 + posts.forEach((post) => { + assert.ok( + post.comments.length > 0, + `Expected post ${post.postId} to have at least one comment` + ); + }); + + // 특정 게시물의 제목이 예상과 일치하는지 검사 (예시로 5번째 게시물 확인) + assert.strictEqual( + posts[4].title, + "nesciunt quas odio", + 'Expected post title to be "nesciunt quas odio" for post ID 5' + ); + + //console.log("All tests passed!"); } +// 테스트 실행 test(1); diff --git "a/\352\271\200\353\257\270\352\260\225/ex7.ts" "b/\352\271\200\353\257\270\352\260\225/ex7.ts" index 62812ac..e894958 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex7.ts" +++ "b/\352\271\200\353\257\270\352\260\225/ex7.ts" @@ -1,3 +1,57 @@ -const POST_URL = 'https://jsonplaceholder.typicode.com/posts'; +const POST_URL = "https://jsonplaceholder.typicode.com/posts"; +const COMMENT_URL = (postId: number) => + `https://jsonplaceholder.typicode.com/posts/${postId}/comments`; -export async function getPosts(userId: number | string) {} +// 게시글과 댓글 타입 +interface Comment { + postId: number; + id: number; + email: string; + body: string; +} + +interface Post { + id: number; + userId: number; + title: string; + body: string; +} + +//comment +async function fetchComments(postId: number): Promise { + const commentRes = await fetch(COMMENT_URL(postId)); + if (!commentRes.ok) { + throw new Error(`Failed to fetch comments for postId: ${postId}`); + } + return (await commentRes.json()) as Comment[]; // 타입 캐스팅 +} + +//getpost +export async function getPosts( + userId: number | string +): Promise<{ postId: number; title: string; comments: Comment[] }[]> { + const postRes = await fetch(`${POST_URL}?userId=${userId}`); + if (!postRes.ok) { + throw new Error("Failed to fetch posts"); + } + + const posts = (await postRes.json()) as Post[]; //타입 캐스팅 + + const postsWithComments = await Promise.all( + posts.map(async (post: Post) => { + const comments = await fetchComments(post.id); + return { + postId: post.id, + title: post.title, + comments: comments.map((comment: Comment) => ({ + postId: comment.postId, + id: comment.id, + email: comment.email, + body: comment.body, + })), + }; + }) + ); + + return postsWithComments; +} diff --git "a/\352\271\200\353\257\270\352\260\225/ex8.ts" "b/\352\271\200\353\257\270\352\260\225/ex8.ts" index a67a2d2..185c9ee 100644 --- "a/\352\271\200\353\257\270\352\260\225/ex8.ts" +++ "b/\352\271\200\353\257\270\352\260\225/ex8.ts" @@ -1,9 +1,33 @@ -// dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +function debounce void>( + cb: T, + delay: number +): (...args: Parameters) => void { + let timer: NodeJS.Timeout | null = null; + + return (...args: Parameters): void => { + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(() => { + cb(...args); + }, delay); + }; +} // function throttle... +function throttle(cb: (arg: T) => void, delay: number): (arg: T) => void { + let lastCall = 0; + + return (arg: T): void => { + const now = Date.now(); + if (now - lastCall >= delay) { + lastCall = now; + cb(arg); + } + }; +} + const debo = debounce((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) debo(i); // 15 출력 diff --git "a/\352\271\200\354\203\201\355\230\204/ex8.ts" "b/\352\271\200\354\203\201\355\230\204/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\352\271\200\354\203\201\355\230\204/ex8.ts" +++ "b/\352\271\200\354\203\201\355\230\204/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\352\271\200\354\204\261\354\247\204/ex8.ts" "b/\352\271\200\354\204\261\354\247\204/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\352\271\200\354\204\261\354\247\204/ex8.ts" +++ "b/\352\271\200\354\204\261\354\247\204/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\352\271\200\354\235\270\354\230\201/ex8.ts" "b/\352\271\200\354\235\270\354\230\201/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\352\271\200\354\235\270\354\230\201/ex8.ts" +++ "b/\352\271\200\354\235\270\354\230\201/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\352\271\200\354\261\204\354\232\264/ex8.ts" "b/\352\271\200\354\261\204\354\232\264/ex8.ts" index a67a2d2..37966ed 100644 --- "a/\352\271\200\354\261\204\354\232\264/ex8.ts" +++ "b/\352\271\200\354\261\204\354\232\264/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +///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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\352\271\200\355\225\264\354\233\220/ex8.ts" "b/\352\271\200\355\225\264\354\233\220/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\352\271\200\355\225\264\354\233\220/ex8.ts" +++ "b/\352\271\200\355\225\264\354\233\220/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\353\260\225\354\213\234\355\231\215/ex8.ts" "b/\353\260\225\354\213\234\355\231\215/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\353\260\225\354\213\234\355\231\215/ex8.ts" +++ "b/\353\260\225\354\213\234\355\231\215/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\353\260\225\354\247\200\355\231\230/ex8.ts" "b/\353\260\225\354\247\200\355\231\230/ex8.ts" index a67a2d2..9589cec 100644 --- "a/\353\260\225\354\247\200\355\231\230/ex8.ts" +++ "b/\353\260\225\354\247\200\355\231\230/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//onst debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\353\260\225\354\261\204\353\246\260/ex8.ts" "b/\353\260\225\354\261\204\353\246\260/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\353\260\225\354\261\204\353\246\260/ex8.ts" +++ "b/\353\260\225\354\261\204\353\246\260/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\226\221\354\247\200\354\235\200/ex8.ts" "b/\354\226\221\354\247\200\354\235\200/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\226\221\354\247\200\354\235\200/ex8.ts" +++ "b/\354\226\221\354\247\200\354\235\200/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\234\240\354\234\240\354\240\225/ex8.ts" "b/\354\234\240\354\234\240\354\240\225/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\234\240\354\234\240\354\240\225/ex8.ts" +++ "b/\354\234\240\354\234\240\354\240\225/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\234\241\354\247\200\354\235\200/ex8.ts" "b/\354\234\241\354\247\200\354\235\200/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\234\241\354\247\200\354\235\200/ex8.ts" +++ "b/\354\234\241\354\247\200\354\235\200/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\234\244\352\261\264\355\235\254/ex8.ts" "b/\354\234\244\352\261\264\355\235\254/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\234\244\352\261\264\355\235\254/ex8.ts" +++ "b/\354\234\244\352\261\264\355\235\254/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\234\244\354\230\201\355\227\214/ex8.ts" "b/\354\234\244\354\230\201\355\227\214/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\234\244\354\230\201\355\227\214/ex8.ts" +++ "b/\354\234\244\354\230\201\355\227\214/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\235\264\353\217\231\354\234\244/ex8.ts" "b/\354\235\264\353\217\231\354\234\244/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\235\264\353\217\231\354\234\244/ex8.ts" +++ "b/\354\235\264\353\217\231\354\234\244/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\235\264\354\210\230\353\257\274/ex8.ts" "b/\354\235\264\354\210\230\353\257\274/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\235\264\354\210\230\353\257\274/ex8.ts" +++ "b/\354\235\264\354\210\230\353\257\274/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\235\264\354\235\270\354\210\230/ex8.ts" "b/\354\235\264\354\235\270\354\210\230/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\235\264\354\235\270\354\210\230/ex8.ts" +++ "b/\354\235\264\354\235\270\354\210\230/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\235\264\355\225\230\353\212\230/ex8.ts" "b/\354\235\264\355\225\230\353\212\230/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\235\264\355\225\230\353\212\230/ex8.ts" +++ "b/\354\235\264\355\225\230\353\212\230/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\236\204\354\210\230\354\247\204/ex8.ts" "b/\354\236\204\354\210\230\354\247\204/ex8.ts" index a67a2d2..37966ed 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex8.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +///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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\240\225\354\212\271\354\232\251/ex8.ts" "b/\354\240\225\354\212\271\354\232\251/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\240\225\354\212\271\354\232\251/ex8.ts" +++ "b/\354\240\225\354\212\271\354\232\251/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\240\225\354\227\260\354\261\204/ex8.ts" "b/\354\240\225\354\227\260\354\261\204/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex8.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\240\225\354\244\221\354\235\274/ex8.ts" "b/\354\240\225\354\244\221\354\235\274/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\240\225\354\244\221\354\235\274/ex8.ts" +++ "b/\354\240\225\354\244\221\354\235\274/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\265\234\354\204\240\354\240\225/ex8.ts" "b/\354\265\234\354\204\240\354\240\225/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\265\234\354\204\240\354\240\225/ex8.ts" +++ "b/\354\265\234\354\204\240\354\240\225/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\265\234\355\230\201\355\203\234/ex8.ts" "b/\354\265\234\355\230\201\355\203\234/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\265\234\355\230\201\355\203\234/ex8.ts" +++ "b/\354\265\234\355\230\201\355\203\234/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\354\265\234\355\232\250\354\204\235/ex8.ts" "b/\354\265\234\355\232\250\354\204\235/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\354\265\234\355\232\250\354\204\235/ex8.ts" +++ "b/\354\265\234\355\232\250\354\204\235/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\355\225\234\354\204\261\353\257\274/ex8.ts" "b/\355\225\234\354\204\261\353\257\274/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\355\225\234\354\204\261\353\257\274/ex8.ts" +++ "b/\355\225\234\354\204\261\353\257\274/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\355\225\250\355\230\225\354\243\274/ex8.ts" "b/\355\225\250\355\230\225\354\243\274/ex8.ts" index a67a2d2..aadb446 100644 --- "a/\355\225\250\355\230\225\354\243\274/ex8.ts" +++ "b/\355\225\250\355\230\225\354\243\274/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +//const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력 diff --git "a/\355\231\215\354\206\214\355\235\254/ex8.ts" "b/\355\231\215\354\206\214\355\235\254/ex8.ts" index a67a2d2..113cd5a 100644 --- "a/\355\231\215\354\206\214\355\235\254/ex8.ts" +++ "b/\355\231\215\354\206\214\355\235\254/ex8.ts" @@ -1,11 +1,11 @@ // dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +///const debounce = (cb: any, delay: number) => (i: number) => {}; +//const throttle = (cb: any, delay: number) => (i: number) => {}; // function throttle... -const debo = debounce((a: number) => console.log(a + 1), 500); +//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); +//const thro = throttle((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) thro(i); // 11 출력