UNPKG

create-bananass

Version:

Create a Bananass framework project for solving Baekjoon problems with JavaScript/TypeScript.๐ŸŒ

162 lines (109 loc) โ€ข 7.26 kB
# ๋ฐ”๋‚˜๋‚˜<sup>Bananass</sup> [![lint](https://img.shields.io/github/actions/workflow/status/lumirlumir/npm-bananass/lint.yml?label=lint&color=fff478&labelColor=333333&logo=github)](https://github.com/lumirlumir/npm-bananass/actions/workflows/lint.yml) [![test](https://img.shields.io/github/actions/workflow/status/lumirlumir/npm-bananass/test.yml?label=test&color=fff478&labelColor=333333&logo=github)](https://github.com/lumirlumir/npm-bananass/actions/workflows/test.yml) [![test-cross-platform](https://img.shields.io/github/actions/workflow/status/lumirlumir/npm-bananass/test-cross-platform.yml?label=test-cross-platform&color=fff478&labelColor=333333&logo=github)](https://github.com/lumirlumir/npm-bananass/actions/workflows/test-cross-platform.yml) [![Codecov](https://img.shields.io/codecov/c/gh/lumirlumir/npm-bananass?token=2zUCHlMFT3&label=Codecov&color=fff478&labelColor=333333&logo=codecov)](https://codecov.io/gh/lumirlumir/npm-bananass) ![Node Current](https://img.shields.io/node/v/bananass?label=Node&color=fff478&labelColor=333333&logo=node.js) [![npm package bananass latest version](https://img.shields.io/npm/v/bananass?label=bananass@latest&color=fff478&labelColor=333333&logo=npm)](https://www.npmjs.com/package/bananass) [![npm package bananass next version](https://img.shields.io/npm/v/bananass/next?label=bananass@next&color=fff478&labelColor=333333&logo=npm)](https://www.npmjs.com/package/bananass) <kbd>ํ•œ๊ตญ์–ด</kbd> | <kbd>[English](README.en.md)</kbd> ๋ฐฑ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋ ˆ์ž„์›Œํฌ. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„. > [!IMPORTANT] > > ```js > const whyBananass = { > banana: '๐ŸŒ', > bananas: '๐ŸŒ๐ŸŒ', > bananass: '๐ŸŒ๐ŸŒ๐ŸŒ๐ŸŒ', > } > ``` > > ```js > console.log(('b' + 'a' + +'a' + 'a').toLowerCase() + (!(1/0) + [])[3].repeat(2)); > ``` <!-- markdownlint-disable-next-line md026 --> ## ์•ˆ๋…•, ๋ฐ”๋‚˜๋‚˜! ๋ฐ”๋‚˜๋‚˜<sup>Bananass</sup> ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ๋ฐ”๋‚˜๋‚˜๋Š” **์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ<sup>JavaScript</sup> ๋ฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ<sup>TypeScript</sup> ๊ธฐ๋ฐ˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด๋ฅผ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ**๋กœ, [๋ฐฑ์ค€](https://www.acmicpc.net/)ใ†[์ฝ”๋“œํฌ์Šค](https://codeforces.com/) ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํ’€์ด ํ”Œ๋žซํผ๋“ค์˜ Node.js ํ™˜๊ฒฝ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋งˆ์ฃผ์น˜๋Š” ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๋ฉฐ, ๊ฐ„๊ฒฐํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ<sup>TypeScript</sup> ์ง€์›์ด ํ•„์š”ํ•˜์‹œ๋‹ค๊ณ ์š”? - ES16<sup>ES2025</sup> ๋“ฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ตœ์‹  ๋ฌธ๋ฒ•์„ ์“ฐ๊ณ  ์‹ถ์€๋ฐ ๋ง‰ํžˆ์…จ๋‚˜์š”? - ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? - ๋งค๋ฒˆ `readline` / `fs` ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ ๋ณต๋ถ™ํ•˜๊ธฐ ์ง€์น˜์…จ๋‚˜์š”? ์ด์ œ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”! ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ์ ๋“ค์„ ๋ชจ๋‘ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ## ์™œ ๋ฐ”๋‚˜๋‚˜์ผ๊นŒ์š”? ํ•จ๊ป˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ [๋ฐฑ์ค€ 1000๋ฒˆ: A+B](https://www.acmicpc.net/problem/1000) ๋ฌธ์ œ ํ’€์ด ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค! - ๊ธฐ์กด ๋ฐฉ๋ฒ•์„ ํ†ตํ•œ ๋ฌธ์ œ ํ’€์ด. ```js const readline = require('node:readline'); const { EOL } = require('node:os'); let inputStr = ''; const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on('line', line => { inputStr = `${inputStr}${line}${EOL}`; }).on('close', () => { console.log(solution(inputStr)); process.exit(0); }); function solution(input) { const [a, b] = input .trim() .split(' ') .map(val => Number(val)); return a + b; } ``` - ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•œ ๋ฌธ์ œ ํ’€์ด. ```js function solution(input) { const [a, b] = input .trim() .split(' ') .map(Number); return a + b; } export default { solution }; ``` ๋” ๊ฐ„๊ฒฐํ•˜๊ณ , ๋” ์ง๊ด€์ ์ธ ์ฝ”๋“œ! ์ž…๋ ฅ ์ฒ˜๋ฆฌ์— ๋“ค์ด๋˜ ์‹œ๊ฐ„์€ ์ค„์ด๊ณ , ์˜ค์ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ## ์ด๊ฒŒ ์ „๋ถ€์ธ๊ฐ€์š”? ๋ฌผ๋ก , ์•„๋‹™๋‹ˆ๋‹ค! - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ<sup>JavaScript</sup> ๋ฐ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ<sup>TypeScript</sup> ์ง€์›. - ESM<sup>ECMAScript Module</sup> ๋ฐ CommonJS ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์ง€์›. - ๋ฐฑ์ค€ Node.js ํ™˜๊ฒฝ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ES16<sup>ES2025</sup> ๋“ฑ ์ตœ์‹  ๋ฌธ๋ฒ• ์ง€์›. - ์‚ฌ์šฉ์ž ์ •์˜ ๋ชจ๋“ˆ ๋ฐ `lodash` ๋“ฑ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ง€์›. - ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์ฒ˜๋Ÿผ `solution` ํ•จ์ˆ˜ ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ์ง€์›. - ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ ๋ฐ ์‹คํ–‰ ์ง€์›. - `create-bananass`๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ์ง€์›. - `fs` ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ ๋”์šฑ ๋น ๋ฅธ ์ž…์ถœ๋ ฅ ์ง€์›. - ํŽธ์˜๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ CLI ๋ช…๋ น์–ด ์ง€์›. - ํ’๋ถ€ํ•˜๊ณ  ์ƒ์„ธํ•œ ๋ฌธ์„œ ์ง€์›. - ESLint ๋ฐ Prettier ์ž์ฒด ์ง€์›. ์–ด๋–ค๊ฐ€์š”? ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ๋”์šฑ ํŽธ๋ฆฌํ•œ ๋ฌธ์ œ ํ’€์ด๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์ง€ ์•Š์œผ์‹ ๊ฐ€์š”? ## ๋ฐ”๋‚˜๋‚˜๋กœ ์‹œ์ž‘ํ•˜๊ธฐ [React](https://ko.react.dev)์˜ `create-react-app`, [Next.js](https://nextjs.org)์˜ `create-next-app` ์ฒ˜๋Ÿผ, ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” `create-bananass`๋กœ ์ง€๊ธˆ ๋ฐ”๋กœ ์ƒˆ๋กœ์šด ๋ฌธ์ œ ํ’€์ด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ฒฝํ—˜ํ•ด๋ณด์„ธ์š”! ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” `create-bananass`๋ฅผ ํ†ตํ•ด ์ฆ‰์‹œ ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```sh npm create bananass@latest ``` ๋” ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ•์€ [๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฌธ์„œ](https://bananass.lumir.page)๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ## ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฌธ์„œ ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ฌธ์„œํ™”๋ฅผ ๊ฐ€์žฅ ํฐ ๊ฐ€์น˜๋กœ ์—ฌ๊น๋‹ˆ๋‹ค. ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“  ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ธฐ๋Šฅ์€ [๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฌธ์„œ](https://bananass.lumir.page)์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ## ๊ธฐ์—ฌ(์ด์Šˆ<sup>Issue</sup>, ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ<sup>Pull Request</sup>, ํ† ๋ก <sup>Discussion</sup>) ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ์—ฌ์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋ฒ„๊ทธ<sup>Bug</sup> ๋ฐ ์ œ์•ˆ<sup>Suggestion</sup> ๋“ฑ ์—ฌ๋Ÿฌ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ด์Šˆ<sup>Issue</sup>, ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ<sup>Pull Request</sup>, ํ† ๋ก <sup>Discussion</sup> ๋“ฑ์„ ๋ชจ๋‘ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ์˜ฌ๋ฐ”๋ฅธ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™˜๊ฒฝ์„ ์ค€์ˆ˜ํ•˜๊ณ  ๋” ๋‚˜์€ ์˜คํ”ˆ ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ๋‚ด์šฉ๋“ค์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”. - [๊ธฐ์—ฌ์ž ํ–‰๋™ ๊ฐ•๋ น ๊ทœ์•ฝ](CODE_OF_CONDUCT.md) - [๊ธฐ์—ฌํ•˜๊ธฐ](CONTRIBUTING.md) ## ๋ฒ„์ „ ์ •์ฑ…<sup>Versioning</sup> ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” [์œ ์˜์  ๋ฒ„์ „ ์ •์ฑ…<sup>Semantic Versioning</sup>](https://semver.org/lang/ko/)์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฆด๋ฆฌ์ฆˆ ๋ฒ„์ „์€ `์ฃผ(MAJOR).๋ถ€(MINOR).์ˆ˜(PATCH)` ํ˜•์‹์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ## ๊ธฐ์—ฌ์ž ํ–‰๋™ ๊ฐ•๋ น ๊ทœ์•ฝ<sup>Code of Conduct</sup> ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๊ธฐ ์ „, [๊ธฐ์—ฌ์ž ํ–‰๋™ ๊ฐ•๋ น ๊ทœ์•ฝ](CODE_OF_CONDUCT.md)์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ## ๋ณ€๊ฒฝ ์‚ฌํ•ญ<sup>Change Log</sup> ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ƒ์„ธํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๋ ค๋ฉด, [๋ณ€๊ฒฝ ์‚ฌํ•ญ](CHANGELOG.md)์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ## ๋ณด์•ˆ<sup>Security</sup> ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜์…จ๋‚˜์š”? [๋ณด์•ˆ](SECURITY.md) ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”. ## ๋ผ์ด์„ ์Šค<sup>License</sup> ๋ฐ”๋‚˜๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” MIT ๋ผ์ด์„ ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. [๋ผ์ด์„ ์Šค](LICENSE.md) ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.